流式内容 — Flask 文档
来自菜鸟教程
Flask/docs/1.1.x/patterns/streaming
流媒体内容
有时您想向客户端发送大量数据,远远超过您想保留在内存中的数据。 但是,当您动态生成数据时,如何在不往返文件系统的情况下将其发送回客户端?
答案是使用生成器和直接响应。
基本用法
这是一个基本的视图函数,可以即时生成大量 CSV 数据。 诀窍是拥有一个内部函数,该函数使用生成器生成数据,然后调用该函数并将其传递给响应对象:
每个 yield
表达式都直接发送到浏览器。 请注意,尽管某些 WSGI 中间件可能会中断流式传输,因此在使用分析器和您可能已启用的其他内容的调试环境中要小心。
从模板流式传输
Jinja2 模板引擎还支持逐块渲染模板。 Flask 没有直接公开此功能,因为它非常罕见,但您可以轻松地自己完成:
这里的技巧是从应用程序的 Jinja2 环境中获取模板对象,并调用 stream()
而不是 render()
,后者返回流对象而不是字符串。 由于我们绕过 Flask 模板渲染函数并使用模板对象本身,我们必须确保自己通过调用 update_template_context()
来更新渲染上下文。 然后在迭代流时评估模板。 因为每次你做一个让服务器将内容刷新到客户端你可能想要缓冲模板中的一些项目,你可以用 rv.enable_buffering(size)
来做。 5
是合理的默认值。
带上下文的流式传输
0.9 版中的新功能。
请注意,当您流式传输数据时,请求上下文在函数执行的那一刻就已经消失了。 Flask 0.9 为您提供了一个帮助程序,可以在生成器执行期间保持请求上下文:
如果没有 stream_with_context()
函数,此时您会得到 RuntimeError
。