Flask SSE流式数据发送异常:逐秒发送失效转为批量发送问题排查
Flask SSE批量发送问题的原因及修复方案
问题根源
- Flask默认响应缓冲:Flask会自动缓冲生成器返回的内容,直到整个生成器执行完毕才一次性发送给客户端,直接导致SSE无法实现每秒推送的预期效果。
- 函数名拼写错误:
stream_route中返回的response是小写,但你导入的是Flask的Response类,这会引发运行时错误(若未报错则属于特殊环境因素,但仍是必须修正的问题)。 - 开发服务器隐性缓冲: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
相关产品推荐
相关产品推荐

