延迟的请求回调¶
Flask的设计原则之一是创建响应对象,并通过一系列可能的回调传递,这些回调可以修改或替换它们。当请求处理开始时,还没有响应对象。它是由视图函数或系统中的其他组件根据需要创建的。
如果要在响应不存在的位置修改响应,会发生什么? 一个常见的例子是:meth:`~flask.Flask.before_request`回调,它想在响应对象上设置一个cookie。
一种方法是避免这种情况。这常常是可能的。例如,您可以尝试将该逻辑移入 after_request()
改为回调。然而,有时在那里移动代码会使推理变得更加复杂或尴尬。
作为替代方案,您可以使用 after_this_request()
注册仅在当前请求之后执行的回调。通过这种方式,您可以根据当前请求从应用程序中的任何位置推迟代码执行。
在请求期间的任何时候,我们都可以在请求结束时注册要调用的函数。 例如,你可以在一个cookie中记住用户当前的语言:meth:~flask.Flask.before_request callback
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