Spec-Zone.ru › Flask 3.0

Отложенные обратные вызовы запроса

Одним из принципов проектирования Flask является то, что объекты ответов создаются и передаются по цепочке потенциальных обратных вызовов, которые могут их изменять или заменять. Когда обработка запроса начинается, объекта ответа ещё нет. Он создаётся по мере необходимости либо функцией представления, либо каким-либо другим компонентом системы.

Что произойдёт, если вы хотите изменить ответ в момент, когда ответа ещё нет? Типичным примером является обратный вызов before_request(), который хочет установить cookie в объекте ответа.

Один из способов — избежать этой ситуации. Очень часто это возможно. Например, вы можете попробовать перенести эту логику в обратный вызов after_request(). Однако иногда перемещение кода туда усложняет или затрудняет понимание.

В качестве альтернативы вы можете использовать after_this_request() для регистрации обратных вызовов, которые будут выполняться только после текущего запроса. Таким образом, вы можете отложить выполнение кода из любого места приложения, основываясь на текущем запросе.

В любой момент обработки запроса мы можем зарегистрировать функцию, которая будет вызвана в конце запроса. Например, вы можете запомнить текущий язык пользователя в cookie в обратном вызове before_request():

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

© 2010 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/3.0.x/patterns/deferredcallbacks/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API