2012-05-09 12 views
5

Ho una chiamata jQuery Ajax, in questo modo:Come rendere Flask/mantenere attiva la connessione HTTP 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); }, 
     }); 

Ho un metodo Flask in questo 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 mostra la finestra di dialogo 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"} 

Tuttavia, Flask risponde senza tenere-vivo.

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

È vero che keep-alive non è implementato?

risposta

6

Il server Web integrato di Werkzeug si basa su BaseHTTerver dalla libreria standard di Python. BaseHTTerver sembra supportare Keep-Alives se si imposta la versione del protocollo HTTP su 1.1.

Werkzeug non lo fa, ma se sei pronto a penetrare nel macchinario che Flask usa per istanziare il BaseWSGIServer di Werkzeug, puoi farlo da solo. Vedi Flask.run() che chiama werkzeug.serving.run_simple(). Quello che devi fare si riduce a BaseWSGIServer.protocol_version = "HTTP/1.1".

Non ho testato la soluzione. Suppongo che tu sappia che il web server di Flask dovrebbe essere usato solo per lo sviluppo.

+0

Infatti, il server web integrato è pensato solo per scopi di sviluppo. – ThiefMaster

+1

Ero apparentemente stanco ieri; Non ho notato che ho avuto una risposta 1.0. :/Darò un'occhiata e vedrò cosa si può fare. Grazie. – Bittrance

13

Il request_handler predefinito è WSGIRequestHandler.

Prima app.run(), Aggiungere una riga, WSGIRequestHandler.protocol_version = "HTTP/1.1"

Non dimenticare from werkzeug.serving import WSGIRequestHandler.

Problemi correlati