2012-05-09 172 views
5

我有一個jQuery的Ajax調用,就像這樣:如何使Flask /保持Ajax HTTP連接處於活動狀態?

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

我有一個像瓶法這樣:

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

然而,瓶答覆無需保持活力。

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

是否確實存在保持活動狀態?

回答

6

Werkzeug的集成Web服務器基於Python標準庫中的BaseHTTPServer構建。如果將HTTP協議版本設置爲1.1,則BaseHTTPServer似乎支持Keep-Alives。

Werkzeug並沒有這樣做,但如果你準備侵入Flask用來實例化Werkzeug的BaseWSGIServer的機器,你可以自己動手做。請致電werkzeug.serving.run_simple()參閱Flask.run()。你必須做的事情歸結爲BaseWSGIServer.protocol_version = "HTTP/1.1"

我還沒有測試過解決方案。我想你知道Flask的web服務器應該只用於開發。

+0

事實上,集成的網絡服務器僅用於開發目的。 – ThiefMaster

+1

昨天我顯然很累,我沒有注意到我收到了1.0的回覆。 :/我會看一看,看看能做些什麼。謝謝。 – Bittrance

13

默認的request_handler是WSGIRequestHandler。

app.run()之前,添加一條線, WSGIRequestHandler.protocol_version = "HTTP/1.1"

不要忘記from werkzeug.serving import WSGIRequestHandler

相關問題