延迟请求回调

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