延迟执行的请求回调

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