- en
 - Language: ru
 
- Documentation version: 1.1.x
 
Обратные вызовы отложенных запросов¶
Один из принципов проектирования 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