如何使用Python Flask流式响应生成器yield处理大文件传输,避免内存溢出和卡顿?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1040个文字,预计阅读时间需要5分钟。
由于默认Flask响应会将整个生成器内容在内存中转成字符串再发送,你可能写了 `yield`。而底层WSGI服务器(如Werkzeug开发服务器)也可能缓存整块响应。结果是文件没有传完,内存先爆了,浏览器直接转圈了。
- 确保视图函数返回的是生成器对象,不是调用后的列表(别写
return list(generator)) - 必须设置
Response的direct_passthrough=True,否则 Flask 会试图读取全部内容做编码检测 - 加上
Content-Length头会让部分客户端提前知道大小,但大文件往往没法预知长度,此时宁可不设,也不要瞎填 - 开发时用
flask run启动的服务器对流支持很弱,上线前务必换gunicorn或uWSGI,并确认启用了--preload和流式中间件
怎么写一个真正流式返回大文件的 Flask 路由?
核心是绕过 Flask 默认响应封装,手动构造 Response,并让生成器按 chunk 拉取、即时写出。不能依赖 send_file 或 send_from_directory —— 它们内部会 open().read() 整个文件。
本文共计1040个文字,预计阅读时间需要5分钟。
由于默认Flask响应会将整个生成器内容在内存中转成字符串再发送,你可能写了 `yield`。而底层WSGI服务器(如Werkzeug开发服务器)也可能缓存整块响应。结果是文件没有传完,内存先爆了,浏览器直接转圈了。
- 确保视图函数返回的是生成器对象,不是调用后的列表(别写
return list(generator)) - 必须设置
Response的direct_passthrough=True,否则 Flask 会试图读取全部内容做编码检测 - 加上
Content-Length头会让部分客户端提前知道大小,但大文件往往没法预知长度,此时宁可不设,也不要瞎填 - 开发时用
flask run启动的服务器对流支持很弱,上线前务必换gunicorn或uWSGI,并确认启用了--preload和流式中间件
怎么写一个真正流式返回大文件的 Flask 路由?
核心是绕过 Flask 默认响应封装,手动构造 Response,并让生成器按 chunk 拉取、即时写出。不能依赖 send_file 或 send_from_directory —— 它们内部会 open().read() 整个文件。

