延迟请求回调

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