如何使用Python Flask流式响应生成器yield处理大文件传输,避免内存溢出和卡顿?

2026-05-08 05:164阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1040个文字,预计阅读时间需要5分钟。

如何使用Python Flask流式响应生成器yield处理大文件传输,避免内存溢出和卡顿?

由于默认Flask响应会将整个生成器内容在内存中转成字符串再发送,你可能写了 `yield`。而底层WSGI服务器(如Werkzeug开发服务器)也可能缓存整块响应。结果是文件没有传完,内存先爆了,浏览器直接转圈了。

  • 确保视图函数返回的是生成器对象,不是调用后的列表(别写 return list(generator)
  • 必须设置 Responsedirect_passthrough=True,否则 Flask 会试图读取全部内容做编码检测
  • 加上 Content-Length 头会让部分客户端提前知道大小,但大文件往往没法预知长度,此时宁可不设,也不要瞎填
  • 开发时用 flask run 启动的服务器对流支持很弱,上线前务必换 gunicornuWSGI,并确认启用了 --preload 和流式中间件

怎么写一个真正流式返回大文件的 Flask 路由?

核心是绕过 Flask 默认响应封装,手动构造 Response,并让生成器按 chunk 拉取、即时写出。不能依赖 send_filesend_from_directory —— 它们内部会 open().read() 整个文件。

阅读全文
标签:Python

本文共计1040个文字,预计阅读时间需要5分钟。

如何使用Python Flask流式响应生成器yield处理大文件传输,避免内存溢出和卡顿?

由于默认Flask响应会将整个生成器内容在内存中转成字符串再发送,你可能写了 `yield`。而底层WSGI服务器(如Werkzeug开发服务器)也可能缓存整块响应。结果是文件没有传完,内存先爆了,浏览器直接转圈了。

  • 确保视图函数返回的是生成器对象,不是调用后的列表(别写 return list(generator)
  • 必须设置 Responsedirect_passthrough=True,否则 Flask 会试图读取全部内容做编码检测
  • 加上 Content-Length 头会让部分客户端提前知道大小,但大文件往往没法预知长度,此时宁可不设,也不要瞎填
  • 开发时用 flask run 启动的服务器对流支持很弱,上线前务必换 gunicornuWSGI,并确认启用了 --preload 和流式中间件

怎么写一个真正流式返回大文件的 Flask 路由?

核心是绕过 Flask 默认响应封装,手动构造 Response,并让生成器按 chunk 拉取、即时写出。不能依赖 send_filesend_from_directory —— 它们内部会 open().read() 整个文件。

阅读全文
标签:Python