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 ...
随机推荐
- 每日Scrum(8)
今天:在程序中嵌入剖面图,进行美化 明天:测试分析,找学弟学妹来体验我们的软件 任务看板: 燃尽图:
- Linux shell(1)
Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh).Bourne Again Shell(/bin/bash).C Shell(/usr/bi ...
- TAC队--团队选题报告
The Art of Code--团队选题报告 一个APP项目能否被大众所接受,能否拥有受众,the most important是它的idea. 一个好的idea可以为项目带来巨大的改变 一个 独特 ...
- Alpha冲刺——测试随笔
写在前面 作业链接 测试工作安排 测试模块 用户登录 日常管理模块 项目展示模块 测试计划 用户登录 测试功能 测试项 输入/操作 检验点 预期效果 用户登录 登录动作 点击登录 报错提示 无法登录, ...
- php排序学习之-冒泡排序
原理:对一组数据,比较相邻数据的大小,将值小数据在前面,值大的数据放在后面. (以下都是升序排列,即从小到大排列) 举例说明: $arr = array(6, 3, 8, 2, 9, 1); $a ...
- Dubbo和Spring Cloud微服务架构比较
Dubbo 出生于阿里系,是阿里巴巴服务化治理的核心框架,并被广泛应用于中国各互联网公司:只需要通过 Spring 配置的方式即可完成服务化,对于应用无入侵,设计的目的还是服务于自身的业务为主. 微服 ...
- orcle 远程连接其他数据库 进行查询数据
CREATE PUBLIC DATABASE LINK testlinkCONNECT TO hxka IDENTIFIED BY bjdscoalUSING '(DESCRIPTION =(ADDR ...
- KD-Tree学习笔记
参考:https://trinkle23897.github.io/pdf/K-D%20Tree.pdf KD-Tree是一种维护K维空间点的类似BST的数据结构.绝大多数时候只用来维护二维空间的点, ...
- docker--从仓库下载镜像到推送自己的项目到仓库步骤详解
怎样从仓库下载的镜像,变成容器,并在容器中制作项目,再将容器变成镜像,然后将镜像推送到仓库? 一:从官网下载镜像 官方的https://hub.docker.com/提供了数十万个镜像提供大家下载 以 ...
- clazz.isArray()
boolean isArray() 判断类型是不是数组 Class clazz = int[].class; System.out.println(clazz.isArray());