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

Flask SSE流式数据发送异常:逐秒发送失效转为批量发送问题排查

Flask SSE批量发送问题的原因及修复方案

问题根源

  1. Flask默认响应缓冲:Flask会自动缓冲生成器返回的内容,直到整个生成器执行完毕才一次性发送给客户端,直接导致SSE无法实现每秒推送的预期效果。
  2. 函数名拼写错误:stream_route中返回的response是小写,但你导入的是Flask的Response类,这会引发运行时错误(若未报错则属于特殊环境因素,但仍是必须修正的问题)。
  3. 开发服务器隐性缓冲:Flask自带的开发服务器在默认设置下,可能会对响应进行额外缓冲,即使生成器正确yield内容,也无法实时推送。

修复步骤

1. 修正Response拼写错误

将stream_route里的小写response改为大写Response,匹配导入的类名。

2. 禁用响应缓冲

生成响应时,通过设置direct_passthrough=True关闭Flask的缓冲机制,同时添加Cache-Control头禁止客户端缓存旧内容,确保每一次yield的内容都能立即推送。

3. 优化开发服务器设置

如果开启了调试模式(debug=True),Flask的重载器可能会干扰SSE推送,建议关闭调试模式,或者添加use_reloader=False参数避免重载影响。

完整修正代码

from flask import Flask, request, Response, session
import time
app = Flask(__name__, template_folder='')

app.secret_key = '123456789'

def event_stream(texts):
    for word in texts:
        time.sleep(1)
        yield "data: {}\n\n".format(word + " ")
    yield "data: {}\n\n".format("endresponse")


@app.route("/", methods=['POST'])
def handle_message():
    if request.method == 'POST':
        message = request.form["message"]
        session['message'] = message
        return ""

@app.route("/stream", methods=['GET'])
def stream_route():
    message = session.get('message')
    if not message:
        return Response("No message stored in session", status=400)
    words = message.split()
    
    resp = Response(event_stream(words), mimetype='text/event-stream')
    resp.headers['Cache-Control'] = 'no-cache'
    resp.direct_passthrough = True
    return resp


if __name__ == "__main__":
    app.run(debug=False)

内容的提问来源于stack exchange,提问作者bathanhlsp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:22:35