2012-05-09 19 views
5

tengo una llamada jQuery Ajax, así:¿Cómo hacer Flask/mantener la conexión HTTP Ajax con vida?

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

Tengo un método de frasco de este modo:

@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 muestra la ventana de 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"} 

Sin embargo, Frasco respuestas sin 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": [...]} 

¿Es realmente el caso que keep-alive no esté implementado?

Respuesta

6

El servidor web integrado de Werkzeug se basa en BaseHTTPServer de la biblioteca estándar de Python. BaseHTTPServer parece ser compatible con Keep-Alives si configura su versión de protocolo HTTP en 1.1.

Werkzeug no lo hace, pero si está listo para hackear la maquinaria que utiliza Flask para crear instancias del BaseWSGIServer de Werkzeug, puede hacerlo usted mismo. Ver Flask.run() que llama al werkzeug.serving.run_simple(). Lo que tienes que hacer se reduce a BaseWSGIServer.protocol_version = "HTTP/1.1".

No he probado la solución. Supongo que sabes que el servidor web de Flask debe usarse solo para desarrollo.

+0

De hecho, el servidor web integrado solo tiene fines de desarrollo. – ThiefMaster

+1

Estaba aparentemente cansado ayer; No noté que obtuve una respuesta de 1.0. :/Voy a echar un vistazo y ver qué se puede hacer. Gracias. – Bittrance

13

El request_handler predeterminado es WSGIRequestHandler.

Antes app.run(), Añadir una línea, WSGIRequestHandler.protocol_version = "HTTP/1.1"

No se olvide from werkzeug.serving import WSGIRequestHandler.

Cuestiones relacionadas