延迟请求回调 — Flask 文档

来自菜鸟教程
Flask/docs/1.1.x/patterns/deferredcallbacks
跳转至:导航、​搜索

延迟请求回调

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