Flask 学习-67.钩子函数before_request 和 before_first_request 的使用
前言
学过pytest框架的肯定知道什么叫钩子(hook)函数, 钩子函数的作用是在程序运行的过程中插入一段代码做一些事情。
四个钩子
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
before_first_request 在对应用程序实例的第一个请求之前注册要运行的函数, 只会执行一次 before_request 在每次请求前执行,如果在某修饰的函数中返回了一个响应,视图函数将不再被调用 after_request 如果没有抛出错误,在每次请求后执行接受一个参数:视图函数作出的响应,在此函数中可以对响应值在返回之前做最后一步修改处理,需要将参数中的响应在此参数中进行返回 teardown_request:每一个请求之后绑定一个函数,即使遇到了异常。。接受一个参数:错误信息,如果有相关错误抛出
before_first_request
before_first_request 在第一次请求之前执行
@app.before_first_request
def first_request():
print('first request: hello ------------------')
使用示例
from flask import Flask, request, g
app = Flask(__name__)
@app.before_first_request
def first_request():
print('first request: hello ------------------')
@app.route('/login')
def login():
user = request.args.get('username')
return {'msg': 'ok', 'admin': user}
@app.route('/index')
def index():
return {'msg': 'ok'}
if __name__ == '__main__':
app.run()
before_first_request 在项目启动后,第一次请求之前仅执行一次
before_request 和 after_request
before_request 在每次请求前执行,如果在某修饰的函数中返回了一个响应,视图函数将不再被调用 after_request 如果没有抛出错误,在每次请求后执行接受一个参数
before_request 可以用于拦截请求数据,比如打印一些日志
@app.before_request
def pre_request():
app.logger.debug(f'path:{request.path}')
app.logger.debug(f'args:{dict(request.args)}')
app.logger.debug(f'headers:{request.headers}')
app.logger.debug(f'cookies:{dict(request.cookies)}')
app.logger.debug(f'json:{request.json}')
完整的示例
from flask import Flask, request, g, abort
app = Flask(__name__)
@app.before_request
def pre1_request():
print('pre1_request')
@app.before_request
def pre2_request():
print('pre2_request')
@app.after_request
def aft1_request(response):
print('aft1_request')
return response
@app.after_request
def aft2_request(response):
print('aft2_request')
return response
@app.teardown_request
def teardown(exc=None):
print('teardown_request')
@app.route('/login')
def login():
user = request.args.get('username')
return {'msg': 'ok', 'admin': user}
@app.route('/index')
def index():
return {'msg': 'ok'}
if __name__ == '__main__':
app.run()
执行顺序是
pre1_request
pre2_request
aft2_request
aft1_request
teardown_request
before_request 先注册的先执行,after_request先注册的后执行。 after_request 被触发的前提是没有异常抛出; 或者异常被 errorhandler 接住并处理
比如abort(400)
异常被errorhandler 接住并处理,那么after_request也会执行。
@app.route('/index')
def index():
abort(400)
teardown_request
teardown_request 就和其余的三个不太一样了. 严格的来说 teardown_request 没有固定的执行位置. 因为他直接和请求上下文环境挂钩. 只有在请求上下文被 pop 出请求栈的时候才会触发 teardown_request, 所以即使之前有抛出错误的时候也会都会被执行, 执行完后返回 response.
@app.teardown_request
def teardown(exc=None):
print('teardown_request')
总的来说, 这几个装饰器装饰的方法执行的先后为 before_request -> errorhandler -> after_request teardown_request 在将当前请求 pop 出请求栈的时候执。
2022年第 12期《python接口web自动化+测试开发》课程,9月17号开学!
本期上课时间:2022年9月17号 - 2022年12月17号,周六周日上午9:00-11:00
报名费:报名费3000一人(周期3个月)
联系微信/QQ:283340479
相关文章
- pycharm使用matplotlib绘图学习笔记「建议收藏」
- ThinkPHP5学习001-使用模板
- Thinkphp5学习016-项目案例-项目修改要求
- MVC学习笔记八:WebGrid控件的高级使用「建议收藏」
- 安全领域中使用机器学习的注意事项
- 深度学习时代下的RGB-D显著性目标检测研究进展
- Oracle学习记录之使用自定义函数和触发器实现主键动态生成
- Java学习笔记之十Java中循环语句foreach使用总结及foreach写法失效的问题详解编程语言
- MySQL入门指南:学习使用MySQL快速上手(mysql使用入门教程)
- MySQL学习:从零开始使用MySQL软件(学习mysql用什么软件)
- MySQL流程函数:学习如何使用它们(mysql流程函数)
- Jacob使用Linux:一种新的学习方式(jacoblinux)
- 学习Linux:掌握必备知识获台无敌能力!(怎么自学linux)
- MySQL学习:使用SELECT语句获取日期的年份(mysql获取日期的年份)
- 轻松学习:如何在文本编辑中使用MySQL(文本使用mysql)
- 从Linux Wiki学习Linux技术(linuxwiki)
- 学习使用SQLserver促进数据库开发进步(学会SQLserver)
- 学习Linux如何使用删除文件函数(linux删除文件函数)
- 函数SQL Server:学习标量函数的基本使用方法(sqlserver 标量)
- Linux尾巴摆动:学习使用tail命令(linux的tail)
- MySQL学习笔记如何使用chr函数(mysql中chr函数)
- MySQL学习笔记使用ABS函数对数据进行绝对值计算(mysql 中abs函数)
- MySQL学习笔记如何实现两表多列合并(mysql 两表多列合并)
- 快速学习如何使用MySQL函数取两者最小值(mysql两者取最小)
- Oracle 学习余数函数的使用(oracle 余数函数)
- 滴滴研究院副院长叶杰平:大规模稀疏和低秩学习(下)
- javascript学习随笔(使用window和frame)的技巧
- javascript基础简介适合新手学习