我在Flask视图中遇到问题,该视图应返回内容类型为“ application / json”的响应以响应POST请求。具体来说,如果我这样做:
curl -v -d 'foo=bar' http://example.org/jsonpost
对此视图:
@app.route('/jsonpost', methods=['GET', 'POST']) def json_post(): resp = make_response('{"test": "ok"}') resp.headers['Content-Type'] = "application/json" return resp
我得到某种连接重置:
* About to connect() to example.org port 80 (#0) * Trying xxx.xxx.xxx.xxx... connected * Connected to example.org (xxx.xxx.xxx.xxx) port 80 (#0) > POST /routing/jsonpost HTTP/1.1 > User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15 > Host: example.org > Accept: */* > Content-Length: 7 > Content-Type: application/x-www-form-urlencoded > < HTTP/1.1 200 OK < Server: nginx/1.2.4 < Date: Thu, 27 Dec 2012 14:07:59 GMT < Content-Type: application/json < Content-Length: 14 < Connection: keep-alive < Set-Cookie: session="..."; Path=/; HttpOnly < Cache-Control: public < * transfer closed with 14 bytes remaining to read * Closing connection #0 curl: (18) transfer closed with 14 bytes remaining to read
如果相反,我这样做:
curl -d 'foo=bar' http://example.org/htmlpost
至:
@app.route('/htmlpost', methods=['GET', 'POST']) def html_post(): resp = make_response('{"test": "ok"}') resp.headers['Content-Type'] = "text/html" return resp
我得到了预期的全面答复(200 ok)
{"test": "ok"}
顺便说一句,如果我将GET请求发送到同一JSON路由:
curl http://example.org/jsonpost
我也得到了预期的答复。
感谢Audrius的评论,我找到了uWSGI和nginx之间交互的问题的可能根源:显然,如果您在请求中收到POST数据,则 必须先 读取它,然后再返回响应。
例如,这解决了我的问题。
@app.route('/jsonpost', methods=['GET', 'POST']) def json_post(): if request.method == 'POST': dummy = request.form resp = make_response('{"test": "ok"}') resp.headers['Content-Type'] = "application/json" return resp
如[uWSGI的作者Roberto DeIoris]--post-buffering1所述,一种不同的解决方案涉及传递给uWSGI。
--post-buffering1
我仍然不明白为什么问题不会在Content-Type设置为"text/html"
Content-Type
"text/html"