流内容¶
答案是使用生成器和直接响应。
下面是一个在运行中产生大量 CSV 数据的基本视图函数。其技巧是调用一个内联函数生成数据,把这个函数传递给一个响应对象:
每个 表达式被直接传送给浏览器。注意,有一些 WSGI 中间件可能会打断流内容,因此在使用分析器或者其他工具的调试环境中要小心一些。
上例的技巧是从 Jinja2 环境中获得应用的模板对象,并调用stream()
来代替 ,返回一个流对象来代替一个字符串。由于我们绕过了 Flask 的模板渲染函数使用了模板对象本身,因此我们需要调用update_template_context()
,以确保更新被渲染的内容。这样,模板遍历流内容。由于每次产生内容后,服务器都会把内容发送给客户端,因此可能需要缓存来保存内容。我们使用了 来进行缓存。 5
是一个比较明智的缺省值。
Changelog
注意,当你生成流内容时,请求情境已经在函数执行时消失了。 Flask 0.9 为你提供了一点帮助,让你可以在生成器运行期间保持请求情境:
如果没有使用 函数,那么就会引发RuntimeError
错误。