如何使 Flask/保持 Ajax HTTP 连接处于活动状态?
我有一个 jQuery Ajax 调用,如下所示:
I have a jQuery Ajax call, like so:
$("#tags").keyup(function(event) {
$.ajax({url: "/terms",
type: "POST",
contentType: "application/json",
data: JSON.stringify({"prefix": $("#tags").val() }),
dataType: "json",
success: function(response) { display_terms(response.terms); },
});
我有一个像这样的 Flask 方法:
I have a Flask method like so:
@app.route("/terms", methods=["POST"])
def terms_by_prefix():
req = flask.request.json
tlist = terms.find_by_prefix(req["prefix"])
return flask.jsonify({'terms': tlist})
tcpdump 显示 HTTP 对话框:
tcpdump shows the HTTP dialog:
POST /terms HTTP/1.1
Host: 127.0.0.1:5000
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://127.0.0.1:5000/
Content-Length: 27
Pragma: no-cache
Cache-Control: no-cache
{"prefix":"foo"}
然而,Flask 回复时没有保持活动状态.
However, Flask replies without keep-alive.
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 445
Server: Werkzeug/0.8.3 Python/2.7.2+
Date: Wed, 09 May 2012 17:55:04 GMT
{"terms": [...]}
真的没有实现keep-alive吗?
Is it really the case that keep-alive is not implemented?
Werkzeug 的集成 Web 服务器基于 Python 标准库中的 BaseHTTPServer 构建.如果您将其 HTTP 协议版本设置为 1.1,BaseHTTPServer 似乎支持 Keep-Alives.
Werkzeug's integrated web server builds on BaseHTTPServer from Python's standard library. BaseHTTPServer seems to support Keep-Alives if you set its HTTP protocol version to 1.1.
Werkzeug 不会这样做,但如果您准备入侵 Flask 用来实例化 Werkzeug 的 BaseWSGIServer 的机器,您可以自己动手.参见调用 werkzeug.serving.run_simple()
的 Flask.run()
.你要做的归结为BaseWSGIServer.protocol_version = "HTTP/1.1"
.
Werkzeug doesn't do it but if you're ready to hack into the machinery that Flask uses to instantiate Werkzeug's BaseWSGIServer, you can do it yourself. See Flask.run()
which calls werkzeug.serving.run_simple()
. What you have to do boils down to BaseWSGIServer.protocol_version = "HTTP/1.1"
.
我还没有测试过解决方案.我想您确实知道 Flask 的 Web 服务器应该仅用于开发.
I haven't tested the solution. I suppose you do know that Flask's web server ought to be used for development only.