Отложенные обратные вызовы запроса
Одним из принципов проектирования 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/stable/patterns/deferredcallbacks/