You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:39:56