Deferred Request Callbacks

One of the design principles of Flask is that response objects are created andpassed down a chain of potential callbacks that can modify them or replacethem. When the request handling starts, there is no response object yet. It iscreated as necessary either by a view function or by some other component inthe system.

What happens if you want to modify the response at a point where the responsedoes not exist yet? A common example for that would be abefore_request() callback that wants to set a cookie on theresponse object.

One way is to avoid the situation. Very often that is possible. For instanceyou can try to move that logic into a after_request()callback instead. However, sometimes moving code there makes it moremore complicated or awkward to reason about.

As an alternative, you can use after_this_request() to registercallbacks that will execute after only the current request. This way you candefer code execution from anywhere in the application, based on the currentrequest.

At any time during a request, we can register a function to be called at theend of the request. For example you can remember the current language of theuser in a cookie in a before_request() callback:

  1. from flask import request, after_this_request
  2.  
  3. @app.before_request
  4. def detect_user_language():
  5. language = request.cookies.get('user_lang')
  6.  
  7. if language is None:
  8. language = guess_language_from_request()
  9.  
  10. # when the response exists, set a cookie with the language
  11. @after_this_request
  12. def remember_language(response):
  13. response.set_cookie('user_lang', language)
  14. return response
  15.  
  16. g.language = language