前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Flask 学习-67.钩子函数before_request 和 before_first_request 的使用

Flask 学习-67.钩子函数before_request 和 before_first_request 的使用

作者头像
上海-悠悠
发布于 2022-09-19 07:43:38
发布于 2022-09-19 07:43:38
2.2K01
代码可运行
举报
运行总次数:1
代码可运行

前言

学过pytest框架的肯定知道什么叫钩子(hook)函数, 钩子函数的作用是在程序运行的过程中插入一段代码做一些事情。

四个钩子

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

before_first_request      在对应用程序实例的第一个请求之前注册要运行的函数, 只会执行一次 before_request  在每次请求前执行,如果在某修饰的函数中返回了一个响应,视图函数将不再被调用 after_request  如果没有抛出错误,在每次请求后执行接受一个参数:视图函数作出的响应,在此函数中可以对响应值在返回之前做最后一步修改处理,需要将参数中的响应在此参数中进行返回 teardown_request:每一个请求之后绑定一个函数,即使遇到了异常。。接受一个参数:错误信息,如果有相关错误抛出

before_first_request

before_first_request 在第一次请求之前执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.before_first_request
def first_request():
    print('first request: hello ------------------')

使用示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 可以用于拦截请求数据,比如打印一些日志

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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}')

完整的示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

执行顺序是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pre1_request
pre2_request
aft2_request
aft1_request
teardown_request

before_request 先注册的先执行,after_request先注册的后执行。 after_request 被触发的前提是没有异常抛出; 或者异常被 errorhandler 接住并处理

比如abort(400)异常被errorhandler 接住并处理,那么after_request也会执行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.route('/index')
def index():
    abort(400)

teardown_request

teardown_request 就和其余的三个不太一样了. 严格的来说 teardown_request 没有固定的执行位置. 因为他直接和请求上下文环境挂钩. 只有在请求上下文被 pop 出请求栈的时候才会触发 teardown_request, 所以即使之前有抛出错误的时候也会都会被执行, 执行完后返回 response.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
flask之请求钩子
from flask import Flask from flask import abort app = Flask(__name__) # 在第一次请求之前调用,可以在此方法内部做一些初始化操作 @app.before_first_request def before_first_request(): print("before_first_request") # 在每一次请求之前调用,这时候已经有请求了,可能在这个方法里面做请求的校验 # 如果请求的校验不成功,可以直接在此方法中进行
汪凡
2019/03/01
4400
Flask 请求钩子
在Django中有中间件这个类来做一些视图执行前、执行中、执行后的一些额外业务处理,那么在Flask则是采用请求钩子的方式来处理。
Devops海洋的渔夫
2019/12/16
8810
Flask 请求钩子
flask中请求勾子
在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:     *在请求开始时,建立数据库连接;     *在请求开始时,根据需求进行权限校验;     *在请求结束时,指定数据的交互格式;
py3study
2020/01/19
3840
Flask 请求钩子
为了让每个视图函数避免编写重复功能的代码,Flask 提供了通用设施的功能,即请求钩子。
忆想不到的晖
2022/05/11
8430
Flask 请求钩子
Flask(中间件与全局变量 九)
当Flask应用处理请求时,它会根据从WSGI服务器收到的环境创建一个Request对象.
zx钟
2020/07/07
2.1K0
Flask入门很轻松 (二)
转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10959454.html
py3study
2020/01/15
3770
Flask的请求扩展
from flask import Flask,request app = Flask(__name__) 一.请求前 before_request 用法 @app.before_request def func(): print(request) #可以在请求来前对于request进行处理 #return 如果有返回值页面将渲染返回值不走@app.routex相关函数 #如有有返回值且有after_request相关函数他的返回值会接着执行after_request相关函数
小小咸鱼YwY
2020/06/19
4840
Flask之视图函数
如果按照正常的写法直接在视图函数上加装饰器@wrapper,则会报错,这是因为加完装饰器之后,原函数名就改变了。
人生不如戏
2018/08/01
4290
Python Flask高级用法:构建强大而可扩展的Web应用
Flask是一款简单而灵活的Web框架,但其灵活性同时也为开发者提供了许多高级用法和扩展,使得可以构建强大而可扩展的Web应用。本文将深入介绍一些Flask的高级用法,包括Blueprints、Middleware、信号处理以及一些优化和安全性的实践。
dbdocker
2024/02/05
3570
python flask web开发实战
路由: @app.route('/') def index(): return '<h1>hello</h1>'
用户5760343
2019/07/05
6200
Flask入门笔记(一)
一、程序的基本结构 1.1 最简单的Flask程序 1 2 3 4 5 6 7 8 9 10 11 12 13 14#coding=utf-8 # 初始化 from flask import Flask app = Flask(__name__) # 路由视图函数 @app.route('/') def index(): return '<h1>Hello World</h1>' if __name__ == '__main__': # 启动服务器 app.run(debug=True)
marsggbo
2018/01/23
6220
Flask 学习笔记
Flask 是一个Web应用框架,我也就是一边看书,一边写博文做记录 这本书: 首先安装Flask ,和配置环境,参考这边博客: 然后就开始学习Flask 了。 1.Application and R
ShenduCC
2018/04/27
6750
Flask 学习笔记
扒源码 - 一个请求在flask中经历了什么
客户端发起一个请求,Flask 都干了什么呢?url 如何与视图进行绑定的?更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
小闫同学啊
2020/04/22
7930
扒源码 - 一个请求在flask中经历了什么
【Flask】FlaskWeb开发上手点滴(01)-入门
首先从flask初始化的一个例子说起。 打开pyCharm新建一个Flask的项目之后,会初始化一个Flask的程序目录(假设创建一个名为flaskblog的项目)。首先来看flaskblog.py这个文件里的代码: (包含注释)
前端修罗场
2023/10/07
2500
Python + Flask 常用的钩子函数
钩子函数是指在执行函数和目标函数之间挂载的函数,框架开发者给调用方提供一个point-挂载点,至于挂载什么函数由调用方决定。
Wu_Candy
2022/07/04
8110
小白学Flask第八天| Flask上下文和请求钩子
在这篇文章之前,我们学习过request和session这两个小家伙,他们两的功能都非常的强大,我们今天讲上下文对象,也是和他们两有着很大的关系。
Python进击者
2019/09/17
6180
Python Flask 编程 | 连载 03 - Flask 请求
应用上下文对象有两个,分别是 current_app 表示当前应用的实例以及 g 表示处理请求时临时存储对象,每次请求都会重设这个变量,并且 g 对象时线程隔离的,使用g对象需要导入,g 既 global。
RiemannHypothesis
2022/09/26
3490
Python Flask 编程 | 连载 03 - Flask 请求
flask系列八之请求方法、g对象和钩子函数
(2)在写form表单的时候,要指定method='post',并且要指定action='/login/'。
wfaceboss
2019/04/08
5320
Flask 中的上下文管理和请求钩子
在使用 Flask 框架实现功能接口的时候,前端点击按钮发送请求的请求方式和 form 表单提交给后端的数据,后端都是通过 Flask 中的 request 对象来获取的。
Python碎片公众号
2021/02/26
1.8K0
Flask 中的上下文管理和请求钩子
11.Flask钩子函数
     在Flask中钩子函数是使用特定的装饰器的函数。为什么叫做钩子函数呢,是因为钩子函数可以在正常执行的代码中,插入一段自己想要执行的代码,那么这种函数就叫做钩子函数。
zhang_derek
2018/08/01
5870
相关推荐
flask之请求钩子
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文