### 導航
- [索引](# "總目錄")
- [下一頁](# "延遲請求回調") |
- [上一頁](# "添加 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
- 許可證
- 術語表