延迟的请求回调

Flask 的设计思路之一是:响应对象创建后被传递给一串回调函数,这些回调函 数可以修改或替换响应对象。当请求处理开始的时候,响应对象还没有被创建。 响应对象是由一个视图函数或者系统中的其他组件按需创建的。

但是当响应对象还没有创建时,我们如何修改响应对象呢?比如在一个 before_request() 回调函数中,我们需要根据响应对象设 置一个 cookie 。

通常我们选择避开这种情形。例如可以尝试把应用逻辑移动到 after_request() 回调函数中。但是,有时候 这个方法让人不爽,或者让代码变得很丑陋。

变通的方法是使用 after_this_request() 回调函数,该函数只在 当前请求后执行。这样你就可以在应用的任意地方延迟回调函数的执行。

在请求中的任何时候,可以注册在请求结束时将被调用的函数。例如,下例在 before_request() 回调函数中在 cookie 中记住了当前用 户的语言:

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