引自免费微信小程序:皆我百晓生
在你遇到的问题中,客户端无法实现流式输出,而是在数据完全准备好后才一次性返回,这通常是由于代理服务器(如IIS,在你的场景中作为Flask应用的前端代理)不支持或未正确配置以转发流式响应导致的。Flask应用本身能够正确生成流式数据,但当它部署在像IIS这样的Web服务器后面时,需要确保IIS正确地传递这些流式响应给客户端,而不是缓冲整个响应体。
解决方案步骤:
1. 确保IIS支持HTTP长轮询或SSE(Server-Sent Events)
对于支持流式传输,你需要确认IIS是否配置为允许HTTP长轮询或直接支持SSE。这通常涉及到调整IIS的缓冲行为,确保它不会缓冲来自应用程序的响应内容。
2. 配置IIS HTTP响应标头
为了使IIS正确处理Flask应用产生的流式响应,你需要在IIS中设置特定的HTTP响应标头,主要是Transfer-Encoding: chunked
和Content-Type: text/event-stream
,以及可能的Cache-Control: no-cache
来指示不应缓存响应。
操作步骤:
- 打开IIS管理器。
- 导航至你的站点。
- 双击"HTTP响应标头"。
- 在"添加"中,分别添加以下标头:
- 名称:
Transfer-Encoding
,值:chunked
- 名称:
Content-Type
,值:text/event-stream
- (可选)名称:
Cache-Control
,值:no-cache
3. 检查IIS输出缓存设置
默认情况下,IIS可能会启用输出缓存,这对于动态内容和流式传输是不理想的。你需要禁用对Flask应用路径的输出缓存。
- 在IIS管理器中,找到你的站点或应用池。
- 右键点击选择"输出缓存配置"。
- 查找并排除你的流式API路径(如
/stream
)。
4. 使用URL Rewrite模块(如果适用)
在某些情况下,使用IIS的URL Rewrite模块可以帮助正确地路由请求和响应,特别是当涉及到特殊HTTP头部和行为时。但针对你的场景,主要是调整上述的响应标头和缓存设置。
示例代码回顾(保持不变):
你的Flask应用代码看起来已经正确实现了流式API接口,无需修改:
from flask import Flask, Response
import time
app = Flask(__name__)
def generate_data():
for i in range(10):
yield f"data: {i}\n\n" # 注意yield后面多了换行符,这是SSE格式要求
time.sleep(1)
@app.route('/stream')
def stream():
return Response(generate_data(), content_type='text/event-stream')
if __name__ == '__main__':
app.run(debug=True)
确保完成上述IIS配置更改后,重启IIS服务,并再次尝试从客户端访问流式API。这样应该能解决客户端无法实时接收流式数据的问题。