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