延迟的请求回调

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