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/.
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. –