57 lines
1.3 KiB
Python
57 lines
1.3 KiB
Python
import logging
|
|
import traceback
|
|
from itertools import chain
|
|
|
|
from flask import Flask, jsonify, request
|
|
|
|
logger = logging.getLogger()
|
|
|
|
|
|
class Nothing:
|
|
pass
|
|
|
|
|
|
def has_next(peekable_iter):
|
|
return peekable_iter.peek(Nothing) == Nothing
|
|
|
|
|
|
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"])
|
|
def submit():
|
|
nonlocal response_payload_iter
|
|
response_payload_iter = chain(response_payload_iter, process_fn(request, final=True))
|
|
return jsonify({"pickup_endpoint": "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
|