### 导航
- [索引](# "总目录")
- [下一页](# "添加 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
- 许可证
- 术语表