您可以只使用 Flask 来执行批量提交的单个请求,如下所示。
批量请求
[
{
"method" : <string:method>,
"path" : <string:path>,
"body" : <string:body>
},
{
"method" : <string:method>,
"path" : <string:path>,
"body" : <string:body>
}
]
批量响应
[
{
"status" : <int:status_code>,
"response" : <string:response>
},
{
"status" : <int:status_code>,
"response" : <string:response>
}
]
示例代码
def _read_response(response):
output = StringIO.StringIO()
try:
for line in response.response:
output.write(line)
return output.getvalue()
finally:
output.close()
@app.route('/batch', methods=['POST'])
def batch(username):
"""
Execute multiple requests, submitted as a batch.
:statuscode 207: Multi status
"""
try:
requests = json.loads(request.data)
except ValueError as e:
abort(400)
responses = []
for index, req in enumerate(requests):
method = req['method']
path = req['path']
body = req.get('body', None)
with app.app_context():
with app.test_request_context(path, method=method, data=body):
try:
# Can modify flask.g here without affecting flask.g of the root request for the batch
# Pre process Request
rv = app.preprocess_request()
if rv is None:
# Main Dispatch
rv = app.dispatch_request()
except Exception as e:
rv = app.handle_user_exception(e)
response = app.make_response(rv)
# Post process Request
response = app.process_response(response)
# Response is a Flask response object.
# _read_response(response) reads response.response and returns a string. If your endpoints return JSON object,
# this string would be the response as a JSON string.
responses.append({
"status": response.status_code,
"response": _read_response(response)
})
return make_response(json.dumps(responses), 207, HEADERS)