如何让Flask/保持Ajax HTTP连接保持活动状态?

18

我有一个 jQuery 的 Ajax 调用,像这样:

    $("#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 方法如下:

@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 对话:

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没有使用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)真的没有被实现吗?

2个回答

37

默认的请求处理程序是WSGIRequestHandler。

app.run()之前,添加一行代码 WSGIRequestHandler.protocol_version = "HTTP/1.1"

不要忘记导入from werkzeug.serving import WSGIRequestHandler


13

Werkzeug的集成Web服务器基于Python标准库中的BaseHTTPServer构建。 如果将其HTTP协议版本设置为1.1,则BaseHTTPServer似乎支持Keep-Alives。

虽然Werkzeug不支持,但如果您准备好进入Flask用于实例化Werkzeug的BaseWSGIServer的机制,并自己解决问题,那么可以这样做。 请参见 Flask.run() 调用 werkzeug.serving.run_simple()。您需要做的就是将BaseWSGIServer.protocol_version =“HTTP / 1.1”

我没有测试过这个解决方案。 我想您应该知道Flask的Web服务器只应用于开发。


实际上,集成的Web服务器仅用于开发目的。 - ThiefMaster
1
显然昨天我很累;我没有注意到我收到了一条 1.0 的回复。 :/ 我会看看能做些什么。谢谢。 - Bittrance
答案指引了我正确的方向,但是我还需要设置 WSGIRequestHandler.protocol_version = "HTTP/1.1" - Noffls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接