Flask Python流式数据传输失效问题求助
Flask流式SSE传输缓冲问题解决方案
问题核心
代码逻辑本身无错误,但输出被缓冲——不管是Flask debug模式的服务器缓冲、反向代理的缓冲,还是SSE格式不规范导致客户端无法及时识别,都会出现「服务器逐步执行但客户端最后一次性接收」的现象。
关键修复步骤
1. 修正SSE消息格式
SSE有严格的格式要求,每个消息必须以data: 前缀开头,并用\n\n结尾,否则客户端无法正确解析并触发实时事件。修改服务器端生成器的yield内容:
@app.route('/stream', methods=['POST', 'GET']) def stream(): @stream_with_context def generate(): print('1') yield "data: Hello\n\n" # 符合SSE标准格式 time.sleep(1) print('2') yield "data: World\n\n" time.sleep(1) print('3') yield "data: This is\n\n" time.sleep(1) print('4') yield "data: Streaming data\n\n" time.sleep(1) print('5')
2. 禁用Flask的输出缓冲
- 关闭debug模式:Flask的debug模式会强制缓冲输出,直接关闭就能解决本地测试的缓冲问题:
if __name__ == '__main__': app.run(debug=False)
- 若必须用debug:使用Werkzeug的
run_simple手动关闭缓冲:
from werkzeug.serving import run_simple if __name__ == '__main__': run_simple('0.0.0.0', 5000, app, use_reloader=True, use_debugger=True, threaded=True, buffered=False) # 关键:禁用缓冲
3. 添加响应头禁用代理/客户端缓冲
在返回Response时添加头部,防止反向代理或客户端缓存数据:
response = Response(generate(), content_type='text/event-stream') response.headers['X-Accel-Buffering'] = 'no' # 告诉Nginx等反向代理不要缓冲 response.headers['Cache-Control'] = 'no-cache' # 禁止客户端缓存 response.headers['Connection'] = 'keep-alive' return response
4. 生产环境反向代理配置(以Nginx为例)
如果服务部署在Nginx之后,必须禁用Nginx的缓冲,否则依然会被合并输出。在对应的location块添加:
proxy_buffering off; proxy_cache off; proxy_set_header Connection ''; chunked_transfer_encoding on; proxy_http_version 1.1;
修正后的客户端代码
使用标准SSE客户端库接收事件,确保实时处理:
import requests import sseclient reqUrl = 'https://api.my-domain-name.com/stream' headers={'Accept': 'text/event-stream'} response = requests.get(url=reqUrl, headers=headers, stream=True) if response.status_code == 200: client = sseclient.SSEClient(response) for event in client.events(): if event.data: print(event.data) else: print('fail:', response.status_code)
内容的提问来源于stack exchange,提问作者Franson Wu
相关产品推荐
相关产品推荐

