2012-05-09 13 views
5

Ich habe einen Anruf jQuery Ajax, etwa so:Wie mache ich Flask/halte die Ajax-HTTP-Verbindung am Leben?

$("#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); }, 
     }); 

ich ein Flask Methode, wie so haben:

@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 zeigt den 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"} 

jedoch Flask Antworten ohne 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": [...]} 

Ist Keep-Alive wirklich nicht implementiert?

Antwort

6

Der integrierte Webserver von Werkzeug baut auf BaseHTTPServer aus Pythons Standardbibliothek auf. BaseHTTPServer scheint Keep-Alives zu unterstützen, wenn Sie seine HTTP-Protokollversion auf 1.1 festlegen.

Werkzeug macht es nicht, aber wenn Sie bereit sind, sich in die Maschinerie zu hacken, die Flask benutzt, um Werkzeugs BaseWSGIServer instanziieren, können Sie es selbst tun. Siehe Flask.run(), die werkzeug.serving.run_simple() aufruft. Was Sie tun müssen, läuft auf BaseWSGIServer.protocol_version = "HTTP/1.1".

Ich habe die Lösung nicht getestet. Ich nehme an, Sie wissen, dass der Webserver von Flask nur für die Entwicklung verwendet werden sollte.

+0

Tatsächlich ist der integrierte Webserver nur für Entwicklungszwecke gedacht. – ThiefMaster

+1

Ich war gestern anscheinend müde; Ich habe nicht bemerkt, dass ich eine 1.0 Antwort bekommen habe. :/Ich werde schauen und sehen, was getan werden kann. Danke. – Bittrance

13

Der Standard request_handler ist WSGIRequestHandler.

Vor app.run(), In einer Zeile, WSGIRequestHandler.protocol_version = "HTTP/1.1"

Vergessen Sie nicht from werkzeug.serving import WSGIRequestHandler.