2013-08-06 41 views
16

Chỉ với một yêu cầu, tôi cần thực hiện một chức năng sau khi gửi phản hồi cho máy khách. Bởi vì chức năng cần có thời gian và kết thúc trong thời gian chờ kết nối Socket error: [Errno 32] Broken pipeCần thực hiện một chức năng sau khi trả lời phản hồi trong Flask

Có cách nào trong Flask để thực hiện chức năng sau khi trở về yêu cầu

+3

Chính xác, bạn có muốn chức năng thực hiện sau khi yêu cầu hoàn tất không? Nếu nó ghi vào nhật ký, đó là một điều, nhưng nếu bạn muốn trả lại dữ liệu cho người dùng, không có cách nào để làm điều đó nếu kết nối đã thực sự hết thời gian chờ. Đây không phải là một điều Flask, đây chỉ là một điều HTTP; trình duyệt, máy chủ web hoặc bất kỳ thứ gì ở giữa có thể đóng kết nối. Nếu yêu cầu của bạn mất quá nhiều thời gian, hãy xem xét yêu cầu chạy trong một quy trình riêng biệt, với yêu cầu đầu tiên khởi động ứng dụng và ứng dụng của bạn tự động (hoặc người dùng) kiểm tra trạng thái của tác vụ định kỳ thông qua các yêu cầu khác. –

Trả lời

6

Bạn có thể dùng trang trí after_request hoặc tùy chỉnh để tạo ra một after_this_request mà chỉ hoạt động cho yêu cầu cụ thể đó.

Hãy xem đoạn mã này http://flask.pocoo.org/snippets/53/

+7

Cảm ơn bạn đã trả lời nhanh! after_this_request cũng đợi hàm được định nghĩa để hoàn thành và sau đó trả về đáp ứng là có cách nào để gửi phản hồi đầu tiên và sau đó thực thi hàm – naga4ce

+1

có cách nào để đặt thời gian chờ yêu cầu kết nối hoặc thời gian chờ kết nối phản hồi trong bình không? – naga4ce

8

Bạn có thể thử sử dụng phát trực tiếp. Xem ví dụ tiếp theo:

import time 
from flask import Flask, Response 

app = Flask(__name__) 

@app.route('/') 
def main(): 
    return '''<div>start</div> 
    <script> 
     var xhr = new XMLHttpRequest(); 
     xhr.open('GET', '/test', true); 
     xhr.onreadystatechange = function(e) { 
      var div = document.createElement('div'); 
      div.innerHTML = '' + this.readyState + ':' + this.responseText; 
      document.body.appendChild(div); 
     }; 
     xhr.send(); 
    </script> 
    ''' 

@app.route('/test') 
def test(): 
    def generate(): 
     app.logger.info('request started') 
     for i in range(5): 
      time.sleep(1) 
      yield str(i) 
     app.logger.info('request finished') 
     yield '' 
    return Response(generate(), mimetype='text/plain') 

if __name__ == '__main__': 
    app.run('0.0.0.0', 8080, True) 

Tất cả phép thuật trong ví dụ này trong bộ tạo dữ liệu nơi bạn có thể bắt đầu dữ liệu phản hồi, sau khi thực hiện một số nhân viên và lấy dữ liệu trống để kết thúc luồng của bạn.

Đối với chữ cái, hãy xem http://flask.pocoo.org/docs/patterns/streaming/.

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