延迟的请求回调
Flask 的设计思路之一是:响应对象创建后被传递给一串回调函数,这些回调函数可 以修改或替换响应对象。当请求处理开始的时候,响应对象还没有被创建。响应对象 是由一个视图函数或者系统中的其他组件按需创建的。
但是当响应对象还没有创建时,我们如何修改响应对象呢?比如在一个
before_request()
回调函数中,我们需要根据响应对象设置一
个 cookie 。
通常我们选择避开这种情形。例如可以尝试把应用逻辑移动到
after_request()
回调函数中。但是,有时候
这个方法让人不爽,或者让代码变得很丑陋。
变通的方法使用 after_this_request()
回调函数,该函数只在当前
请求后执行。这样你就可以在应用的任意地方延迟回调函数的执行。
在请求中的任何时候,可以注册在请求结束时将被调用的函数。例如,下例在
before_request()
回调函数中在 cookie 中记住了当前用户的
语言:
from flask import request, after_this_request
@app.before_request
def detect_user_language():
language = request.cookies.get('user_lang')
if language is None:
language = guess_language_from_request()
# when the response exists, set a cookie with the language
@after_this_request
def remember_language(response):
response.set_cookie('user_lang', language)
return response
g.language = language