flask基础之请求钩子(十二)
前言
什么是请求钩子?在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子。
请求钩子的原理
先回顾一下flask对请求的处理流程:
接收请求--》创建请求上下文--》请求上下文入栈--》创建该请求的应用上下文--》应用上下文入栈--》处理逻辑--》请求上下文出栈--》应用上下文出栈
看了这个过程,flask放置请求钩子的位置有:处理逻辑之前,处理逻辑之后,应用上下文出栈之前。
flask有五种常用请求钩子:
before_first_request:在处理app第一个请求前运行。
before_request:在每次请求前运行。
after_request:如果处理逻辑没有异常抛出,在每次请求后运行。
teardown_request:在每次请求后运行,即使处理发生了错误。
teardown_appcontext:在应用上下文从栈中弹出之前运行
定义请求钩子
# before_request装饰的方法会加载到app的before_request_funcs列表中,按加载的顺序依次执行,不需要参数
@app.before_request
def rest_test():
print('this is a test'+ '--2')
pass
# before_first_request装饰的函数加载到before_first_request_funcs列表中,只不过在app第一次接收到请求后执行,其他时候不再执行
@app.before_first_request
def app_first_request():
print('first_request' + '--1')
# after_request装饰的函数加载到after_request_funcs列表中,传入的参数是response对象,可以对其进行拦截修改,必须返回一个response对象
@app.after_request
def after_request(rsp):
print(rsp)
print('--3')
return rsp
# teardown_request装饰的函数加载到teardown_request_funcs中,如果发生了异常则传入error的对象,无异常参数为None,无返回值
@app.teardown_request
def teardown_request(error):
print(error)
print('--4')
# teardown_appcontext装饰的函数加载到teardown_appcontext_funcs中,如果发生了异常则传入error的对象,无异常参数为None,无返回值
@app.teardown_appcontext
def teardown_appcontext(error):
print('--5')
注意
在debug模式下,teardown_request和teardown_appcontext装饰的函数不会执行;
after_request请求钩子会自动传入response对象作为参数,同时必须返回一个response对象;
before_request装饰的函数不需要返回数据,如果返回了数据,那么视图函数不会再执行,而是直接返回结果。
蓝图的请求钩子
蓝图存在的目的是为了在大型应用中对众多的业务模块的api分层次管理,所以即使在主app下定义的路由规则,其默认是在None为名字的蓝图下面的,所以蓝图也有自己的请求钩子,只在该蓝图下的api其作用。
from flask import Blueprint
testblue = Blueprint('blue', __name__)
# 蓝图也可以为主app添加请求钩子,before_app_first_request装饰会在app的before_first_request_funcs列表中,以None为键;
@testblue.before_app_first_request
def app_first_request():
print('first_request' + '--1')
# 加载到app的before_request_funcs列表中,在None蓝图下,按加载的顺序依次执行,不需要参数
@testblue.before_app_request
def app_request():
pass
# 加载到app的before_request_funcs列表中,在testblue蓝图下
@testblue.before_request
def blue_before_request():
pass
# 加载到after_request_funcs列表中,在testblue蓝图下
@testblue.after_request
def after_request(rsp):
return rsp
# 加载到after_request_funcs列表中,在None蓝图下
@testblue.after_app_request
def blue_after_app_request(rsp):
return rsp
#teardown_request装饰的函数加载到app的teardown_request_funcs中,在testblue蓝图下
@testblue.teardown_request
def teardown_request(error):
print(error)
print('--4')
# 和teardown_request功能一样,在None蓝图下
@testblue.teardown_app_request
def blue_teardown_app_request(error):
pass
注意
teardown_request装饰的函数无论有没有异常都执行,after_request装饰的函数无异常才执行。
对于before_request、after_request、teardown_request请求钩子,如果app存在相应的请求钩子函数,则蓝图和app的请求钩子函数都会执行,先执行app的钩子函数,再执行蓝图的钩子函数。
参考
flask基础之请求钩子(十二)的更多相关文章
- GIS基础软件及操作(十二)
原文 GIS基础软件及操作(十二) 练习十二. ArcMap制图-地图版面设计 设置地图符号-各种渲染方式的使用 使用ArcMap Layout(布局)界面制作专题地图 将各种地图元素添加到地图版面中 ...
- (三)flask中的请求钩子函数
请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图 ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
- Flask web开发之路十二
ge请求和post请求 ### get请求和post请求:1. get请求: * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求. * 传参:get请求传参是放 ...
- Flask基础(12)-->请求上下文和应用上下文
请求上下文和应用上下文 请求上下文:可以简单理解为客户端与服务器之间数据交互请求的容器 请求上下文对象有:request.Session request:封装了HTTP请求的内容,针对的是http的请 ...
- Flask基础(09)-->请求勾子函数
什么是请求勾子? 为了让每个视图函数避免编写重复的功能代码,flask提供了通用设施的功能,就是所谓的勾子 那么请求勾子就是,在浏览器请求服务器资源的前后挂载相关的处理函数 请求勾子有什么作用? 作用 ...
- Java基础笔试练习(十二)
1.(C#.JAVA)扩展方法能访问被扩展对象的public成员 A.能 B.不能 答案: A 解析: 翻译一下,子类方法是否能够访问父类中的public成员. 2.如果子类要调用父类的构造函数,则通 ...
- 测开之路三十一:Flask基础之请求与相应
from flask import requestrequest.pathrequest.methodrequest.formrequest.argsrequest.values 一般用form获取p ...
随机推荐
- [2017BUAA软工]结对项目-数独程序扩展
零.github地址 GitHub地址:https://github.com/Liu-SD/SudoCmd (这个地址是命令行模式数独的仓库,包含了用作测试的BIN.DLL核心计算模块地址是:http ...
- 【Leetcode】222. Count Complete Tree Nodes
Question: Given a complete binary tree, count the number of nodes. Definition of a complete binary t ...
- PAT 1064 朋友数
https://pintia.cn/problem-sets/994805260223102976/problems/994805267416334336 如果两个整数各位数字的和是一样的,则被称为是 ...
- TCP/IP之大明内阁 转
原创: 刘欣 码农翻身 2016-11-02 本文是<TCP/IP之大明王朝邮差>的前传, 讲一讲大明内阁的各位大人是怎么设计TCP/IP网络的.大明天启年间, 明熹宗朱由校醉心于木工 ...
- PHP4个载入语句的区别
4个载入语句的区别 include和require的区别: include载入文件失败时(即没有找到该文件),报一个“提示错误”,然后继续执行后续代码: requre载入文件失败时,报错并立即终止执行 ...
- SP1043 GSS1
题目链接 简单说就是带修的查询区间最大子段和,用线段树维护即可 对于每个区间,我们肯定要记录它的最大子段和\(v\),但是怎么维护呢? 我们可以记录下从区间左端点开始的最大子段和\(v1\),从右端点 ...
- 【刷题】BZOJ 2724 [Violet 6]蒲公英
Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 Output Sample Input ...
- CentOS安装git及使用Gitolite来管理版本库
首先吐槽一下网上的各种教程,大部分都扯蛋,估计都是些所谓的"编辑"在网上瞎抄来的-- 以下内容都是基于CentOS的服务器端,Mac OS X的客户端. 如果是使用的Windows ...
- 【总结】STL--map
map支持以下功能: size():查询 map 中的 key 的个数 empty():判空 clear():清空 insert()/erase():插入/删除 find(x):查找 key 为 x ...
- C# 分析 IIS 日志(Log)
由于最近又要对 IIS日志 (Log) 分析,以便得出各个搜索引擎每日抓取的频率,所以这两天一直在尝试各个办法来分析 IIS 日志 (Log),其中尝试过:导入数据库.Log parser.Powse ...