12

次のような 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 はキープアライブなしで応答します。

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": [...]}

キープアライブが実装されていないのは本当ですか?

4

2 に答える 2

11

Werkzeug の統合 Web サーバーは、Python の標準ライブラリの BaseHTTPServer に基づいて構築されています。HTTP プロトコルのバージョンを 1.1 に設定すると、BaseHTTPServer は Keep-Alive をサポートしているようです。

Werkzeug はそれを行いませんが、Flask が Werkzeug の BaseWSGIServer をインスタンス化するために使用する機構にハッキングする準備ができている場合は、自分で行うことができます。Flask.run()どの呼び出しを参照してくださいwerkzeug.serving.run_simple()。あなたがしなければならないことは、要約するとBaseWSGIServer.protocol_version = "HTTP/1.1".

私は解決策をテストしていません。Flask の Web サーバーは開発のみに使用する必要があることをご存じだと思います。

于 2012-05-10T05:50:44.233 に答える