pyinfra/pyinfra/server/server.py
2022-05-05 11:56:06 +02:00

49 lines
1.2 KiB
Python

import logging
import traceback
from itertools import chain
from flask import Flask, jsonify, request
logger = logging.getLogger()
def set_up_processing_server(process_fn):
app = Flask(__name__)
response_payload_iter = []
@app.route("/ready", methods=["GET"])
def ready():
resp = jsonify("OK")
resp.status_code = 200
return resp
@app.route("/process", methods=["POST", "PATCH"])
def process():
response_payload = process_fn(request, final=request.method == "POST")
return jsonify(response_payload)
@app.route("/submit", methods=["POST", "PATCH"])
def submit():
nonlocal response_payload_iter
response_payload_iter = chain(response_payload_iter, process_fn(request, final=request.method == "POST"))
return jsonify(f"{request.base_url.replace('/submit', '')}/pickup")
@app.route("/pickup", methods=["GET"])
def pickup():
try:
resp = jsonify(next(response_payload_iter))
resp.status_code = 206
except StopIteration:
resp = jsonify("No more items left")
resp.status_code = 204
except:
logger.error(traceback.format_exc())
raise
return resp
return app