### 導航
- [索引](# "總目錄")
- [下一頁](# "添加 HTTP Method Overrides") |
- [上一頁](# "數據流") |
- [Flask 0.10.1 文檔](#) ?
- [Flask 代碼模式](#) ?
# 延遲請求回調
Flask 的設計原則中有一條是響應對象被創建并在一條可能的回調鏈中傳遞,而在這條回調鏈但中的任意一個回調,您都可以修改或者替換掉他們。當請求開始被處理時,還沒有響應對象,響應對象將在這一過程中,被某個視圖函數或者系統的其他組件按照實際需要來闖將。
但是,如果您想在響應過程的結尾修改響應對象,但是這是對象還不存在,那么會發生什么呢?一個常見的例子是您可能需要在 before-request 函數當中在響應對象上設定 Cookie 。
解決這一情況的一個常用方法是改變代碼的邏輯,將這一部分代碼遷移到after-request 回調中。然而有些時候這種遷移并不是一個非常容易的敬禮而且可能使代碼看起來非常糟糕。
一個可能的替代方法是將一些回調函數綁定到 [g](# "flask.g") 對象中。然后在請求結束的時候調用他們。使用這種方法,您可以從應用里的任何一個地方來指定代碼延遲執行。
### 裝飾器
下面的裝飾器就是關鍵,它將一個函數注冊到 [g](# "flask.g") 對象上的一個函數列表中:
~~~
from flask import g
def after_this_request(f):
if not hasattr(g, 'after_request_callbacks'):
g.after_request_callbacks = []
g.after_request_callbacks.append(f)
return f
~~~
### 調用延遲函數
現在您可以使用 after_this_request 裝飾器來將一個函數標記為在請求結束之后執行,但是我們仍然需要手動調用他們。為此,如下函數將被注冊為[after_request()](# "flask.Flask.after_request") 回調:
~~~
@app.after_request
def call_after_request_callbacks(response):
for callback in getattr(g, 'after_request_callbacks', ()):
response = callback(response)
return response
~~~
### 一個實際應用的例子
現在我們可以在任何時間點將一個函數注冊為在某個特定請求結束后執行,例如您可以在 before-request 中將用戶當前語言的信息保存在 Cookie 中:
~~~
from flask import request
@app.before_request
def detect_user_language():
language = request.cookies.get('user_lang')
if language is None:
language = guess_language_from_request()
@after_this_request
def remember_language(response):
response.set_cookie('user_lang', language)
g.language = language
~~~
? 版權所有 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
- 許可證
- 術語表