2012-05-09 41 views
5

Tôi có một cuộc gọi jQuery Ajax, như vậy:Làm thế nào để làm cho Flask/giữ kết nối HTTP HTTP còn sống?

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

Tôi có một phương pháp Flask như vậy:

@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 cho thấy hộp thoại 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"} 

Tuy nhiên, Flask trả lời mà không cần giữ lại.

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

Thực sự là trường hợp không thể thực hiện được?

Trả lời

6

Máy chủ web tích hợp của Werkzeug xây dựng trên BaseHTTPServer từ thư viện chuẩn của Python. BaseHTTPServer dường như hỗ trợ Keep-Alives nếu bạn thiết lập phiên bản giao thức HTTP của nó thành 1.1.

Werkzeug không làm điều đó nhưng nếu bạn đã sẵn sàng để hack vào máy móc mà Flask sử dụng để khởi tạo Werkzeug's BaseWSGIServer, bạn có thể tự mình làm. Xem Flask.run() gọi werkzeug.serving.run_simple(). Những gì bạn phải làm nhọt xuống BaseWSGIServer.protocol_version = "HTTP/1.1".

Tôi chưa thử nghiệm giải pháp. Tôi cho rằng bạn biết rằng máy chủ web của Flask chỉ nên được sử dụng để phát triển.

+0

Thật vậy, máy chủ web tích hợp chỉ dành cho mục đích phát triển. – ThiefMaster

+1

Tôi dường như mệt mỏi hôm qua; Tôi đã không nhận thấy rằng tôi có một câu trả lời 1.0. :/Tôi sẽ có một cái nhìn và xem những gì có thể được thực hiện. Cám ơn. – Bittrance

13

Trình request_handler mặc định là WSGIRequestHandler.

Trước app.run(), Thêm một dòng, WSGIRequestHandler.protocol_version = "HTTP/1.1"

Đừng quên from werkzeug.serving import WSGIRequestHandler.

Các vấn đề liên quan