### 导航
- [索引](# "总目录")
- [下一页](# "延迟请求回调") |
- [上一页](# "添加 Favicon") |
- [Flask 0.10.1 文档](#) »
- [Flask 代码模式](#) »
# 数据流
有时,您希望发送非常巨量的数据到客户端,远远超过您可以保存在内存中的量。在您实时地产生这些数据时,如何才能直接把他发送给客户端,而不需要在文件系统中中转呢?
答案是生成器和 Direct Response。
### 基本使用
下面是一个简单的视图函数,这一视图函数实时生成大量的 CSV 数据,这一技巧使用了一个内部函数,这一函数使用生成器来生成数据,并且稍后激发这个生成器函数时,把返回值传递给一个 response 对象:
~~~
from flask import Response
@app.route('/large.csv')
def generate_large_csv():
def generate():
for row in iter_all_rows():
yield ','.join(row) + '\n'
return Response(generate(), mimetype='text/csv')
~~~
每一个 yield 表达式直接被发送给浏览器。现在,仍然有一些 WSGI 中间件可能打断数据流,所以在这里请注意那些在带缓存快照的调试环境,以及其他一些您可能激活了的东西。
### 在模板中生成流
Jinja2 模板引擎同样支持分块逐个渲染模板。Flask 没有直接暴露这一功能到模板中,因为它很少被用到,但是您可以很轻易的自己实现:
~~~
from flask import Response
def stream_template(template_name, **context):
app.update_template_context(context)
t = app.jinja_env.get_template(template_name)
rv = t.stream(context)
rv.enable_buffering(5)
return rv
@app.route('/my-large-page.html')
def render_large_template():
rows = iter_all_rows()
return Response(stream_template('the_template.html', rows=rows))
~~~
这一技巧是从应用程序上的 Jinja2 的环境中得到那个模板对象,然后调用stream() 函数而不是 render()函数。前者返回的是一个流对象,而不是后者的字符串。因为我们绕过了 Flask的模板渲染函数,而是直接使用了模板对象,所以我们手动必须调用[update_template_context()](# "flask.Flask.update_template_context") 函数来确保更新了模板的渲染上下文。这一模板随后以流的方式迭代直到结束。因为每一次您使用使用一个 yield 。服务器都会将所有的已经产生的内容塞给给客户端,因可能希望在模板中缓冲一部分元素之后再发送,而不是每次都直接发送。您可以使用 rv.enable_buffering(size)来实现,size 的较为合理的默认值是 5 。
© 版权所有 2013, Armin Ronacher.
- 欢迎使用 Flask
- 前言
- 给有经验程序员的前言
- 安装
- 快速入门
- 教程
- 介绍 Flaskr
- 步骤 0: 创建文件夹
- 步骤 1: 数据库模式
- 步骤 2: 应用设置代码
- 步骤 3: 创建数据库
- 步骤 4: 请求数据库连接
- 步骤 5: 视图函数
- 步骤 6: 模板
- 步骤 7: 添加样式
- 福利: 应用测试
- 模板
- 测试 Flask 应用
- 记录应用错误
- 配置处理
- 信号
- 即插视图
- 应用上下文
- 请求上下文
- 用蓝图实现模块化的应用
- Flask 扩展
- 与 Shell 共舞
- Flask 代码模式
- 大型应用
- 应用程序的工厂函数
- 应用调度
- 使用 URL 处理器
- 部署和分发
- 使用 Fabric 部署
- 在 Flask 中使用 SQLite 3
- 在 Flask 中使用 SQLAlchemy
- 上传文件
- 缓存
- 视图装饰器
- 使用 WTForms 进行表单验证
- 模板继承
- 消息闪现
- 用 jQuery 实现 Ajax
- 自定义错误页面
- 延迟加载视图
- 在 Flask 中使用 MongoKit
- 添加 Favicon
- 数据流
- 延迟请求回调
- 添加 HTTP Method Overrides
- 请求内容校验码
- 基于 Celery 的后台任务
- 部署选择
- mod_wsgi (Apache)
- 独立 WSGI 容器
- uWSGI
- FastCGI
- CGI
- 聚沙成塔
- API
- JSON 支持
- Flask 中的设计决策
- HTML/XHTML 常见问题
- 安全注意事项
- Flask 中的 Unicode
- Flask 扩展开发
- Pocoo 风格指引
- Python 3 支持
- 升级到最新版本
- Flask Changelog
- 许可证
- 术语表