如何使用flask完成数据传输?
作者:卡卷网发布时间:2025-03-29 22:45浏览数量:32次评论数量:0次
根本原因
IIS 的 FastCGI 模块默认启用响应缓冲(Response Buffering),会强制等待 Flask 返回完整 HTTP 响应后再发送给客户端,导致以下问题:
- 流式数据被缓存:Flask 的 text/event-stream 流式响应被 IIS 拦截并缓存,无法实时逐字输出
- HTTP协议配置冲突:FastCGI 默认不支持分块传输编码(Chunked Transfer Encoding)
解决方案
1. 禁用 FastCGI 响应缓冲 通过修改 IIS 的 FastCGI 配置禁用缓冲:
1. 打开 IIS 管理器
2. 进入 FastCGI 设置(服务器节点 → FastCGI 设置)
3. 找到 Python 的 FastCGI 应用(如 wfastcgi.py)
4. 添加以下环境变量:
Name: WSGI_BUFFERING
Value: 0
2. 配置 Flask 响应头 在 app.py 的流式响应中添加防缓存头:
@app.route('/api/ask', methods=['POST'])
def ask():
# ...原有代码...
return Response(
generate(),
mimetype='text/event-stream',
headers={
'Cache-Control': 'no-cache',
'X-Accel-Buffering': 'no' # 强制禁用 Nginx/IIS 缓冲
}
)
3. 禁用 IIS 动态压缩 动态内容压缩会强制缓冲数据:
1. 进入 IIS 管理器
2. 打开 压缩 功能
3. 取消勾选 启用动态内容压缩
4. 验证 MIME 类型
确保 IIS 允许 text/event-stream
类型:
1. 打开 IIS 管理器
2. 进入 MIME 类型 设置
3. 添加以下类型:
扩展名: .*
MIME 类型: text/event-stream
备选方案
如果仍不生效,可改用反向代理模式:
1. 使用 Waitress 或 CherryPy 作为生产服务器运行 Flask:
pip install waitress
waitress-serve --port=5000 app:app
2. 在 IIS 中配置 URL 重写 规则,将请求反向代理到 http://localhost:5000
验证步骤
- 重启 IIS 服务(或应用程序池)
- 使用浏览器开发者工具检查响应头:
http HTTP/1.1 200 OK
Content-Type: text/event-stream
Cache-Control: no-cache
X-Accel-Buffering: no
Transfer-Encoding: chunked # 确保启用分块传输
3. 观察前端是否实时接收流式数据
完成上述步骤后,逐字输出效果应恢复正常。
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
- 上一篇:你听过最野的野史有多野?
- 下一篇:你越来越沉默的原因是什么?
相关推荐

你 发表评论:
欢迎