引言 本文将介绍Flask中request的钩子函数分类、执行顺序。代码示例将写在“蓝图视图对象脚本”中。笔者认为:“Flask的request钩子函数类似于API/UI自动化中的‘(yield)前置准备、后置清理’。 注意 Flask的response是没有钩子函数的。 总结request钩子函数的执行顺序:before_request—>after_request—>视图函数—>teardown_request

1.request钩子函数分类

说明 当前蓝图对象为“addonesApp”,如下所示:

from flask import Blueprint as bp
addonesApp=bp(“addonesApp”,name,urlprefix=“/addones”) # 当前蓝图对象_

分类 【需要】入参(res)/return(res)
before_request 不需要
after_request 需要
teardown_request
【了解】app_errorhandler NA

2.代码实现

我们单独定义一个“addones.py”的蓝图对象文件,定义:“2个before_request,2个after_request,1个teardown_request及1个蓝图视图函数”,具体代码如下(省略蓝图对象的注册):

  1. # -*- coding: utf-8 -*-
  2. """
  3. ====================================
  4. @File Name :addones.py
  5. @Time : 2022/5/2 14:40
  6. @Program IDE :PyCharm
  7. @Create by Author : 一一Cooling
  8. ====================================
  9. """
  10. from flask import Blueprint as bp
  11. addonesApp = bp("addonesApp", '__name__', url_prefix="/addones") # 当前蓝图对象
  12. @addonesApp.before_request
  13. def before_request_A():
  14. print("before_request_A")
  15. @addonesApp.before_request
  16. def before_request_B():
  17. print("before_request_B")
  18. @addonesApp.after_request
  19. def after_request_A1(res):
  20. print("after_request_A1")
  21. return res
  22. @addonesApp.after_request
  23. def after_request_B1(res):
  24. print("after_request_B1")
  25. return res
  26. #@addonesApp.app_errorhandler(404)
  27. #def app_errorhandler():
  28. #print("after_request_B1")
  29. @addonesApp.teardown_request
  30. def teardown_request(res):
  31. print("teardown_request")
  32. return res
  33. @addonesApp.get("/index")
  34. def index():
  35. print("addones-index")
  36. return "addones-index"

3.request钩子函数的执行顺序

我们用apifox访问接口“/addones/index”,通过pycharm的打印输出得到执行顺序,如下所示:

(脚本)定义顺序 before_request_A->before_request_B->after_request_A1->after_request_B1->teardown_request->(蓝图视图函数)index
执行顺序 before_request_A
before_request_B
addones-index
after_request_B1
after_request_A1
teardown_request
image.png

结论

request钩子函数的执行顺序:before_request—>after_request—>视图函数—>teardown_request