前言

什么是请求钩子?在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,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基础之请求钩子(十二)的更多相关文章

  1. GIS基础软件及操作(十二)

    原文 GIS基础软件及操作(十二) 练习十二. ArcMap制图-地图版面设计 设置地图符号-各种渲染方式的使用 使用ArcMap Layout(布局)界面制作专题地图 将各种地图元素添加到地图版面中 ...

  2. (三)flask中的请求钩子函数

    请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图 ...

  3. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  4. salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见

    项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...

  5. Flask web开发之路十二

    ge请求和post请求 ### get请求和post请求:1. get请求: * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求. * 传参:get请求传参是放 ...

  6. Flask基础(12)-->请求上下文和应用上下文

    请求上下文和应用上下文 请求上下文:可以简单理解为客户端与服务器之间数据交互请求的容器 请求上下文对象有:request.Session request:封装了HTTP请求的内容,针对的是http的请 ...

  7. Flask基础(09)-->请求勾子函数

    什么是请求勾子? 为了让每个视图函数避免编写重复的功能代码,flask提供了通用设施的功能,就是所谓的勾子 那么请求勾子就是,在浏览器请求服务器资源的前后挂载相关的处理函数 请求勾子有什么作用? 作用 ...

  8. Java基础笔试练习(十二)

    1.(C#.JAVA)扩展方法能访问被扩展对象的public成员 A.能 B.不能 答案: A 解析: 翻译一下,子类方法是否能够访问父类中的public成员. 2.如果子类要调用父类的构造函数,则通 ...

  9. 测开之路三十一:Flask基础之请求与相应

    from flask import requestrequest.pathrequest.methodrequest.formrequest.argsrequest.values 一般用form获取p ...

随机推荐

  1. C语言版本:顺序表的实现

    seqlist.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include<cstdio> #include<malloc.h> ...

  2. 我与git“美妙”的一天

    今天是第一天使用git,苦不堪言,感觉服务器和自己都要爆炸了,弄了半天才马马虎虎会了一点,基本流程如下 1.在mukever.online注册用户 2.下载git for windows(一个客户端) ...

  3. VS2013新建web项目时出错,系统找不到指定文件

    好不容易找了一个VS2013_RTM_ULT_CHS来安装好,Key:BWG7X-J98B3-W34RT-33B3R-JVYW9 兴高采烈的打开vs2013,新建web项目,结果弹出一个错误: 傻眼了 ...

  4. laravel 登录后跳转原来浏览的页面

    方法 1.修改一下文件/vendor/laravel/framework/src/Illuminate/Foundation/Auth/RedirectsUsers.php 修改内容如下: 没有的加入 ...

  5. html5 & upload files

    html5 & upload files https://www.sitepoint.com/html5-ajax-file-upload/ https://www.webcodegeeks. ...

  6. delphi执行查询语句时的进度条怎么做

    procedure TForm1.FormCreate(Sender: TObject);  begin     ADOQuery1.ExecuteOptions := [eoAsyncFetch]; ...

  7. Python【知识点】傻傻的函数内变量

    问题的由来 有个学生问我一个问题关于函数内部变量的我们来一起看下代码: Code1 x = 50 def func(): print(x) global x print("x修改前的值:&q ...

  8. P3114 [USACO15JAN]踩踏Stampede

    题目链接 我一开始看错题了,看成每秒走\(c_i\)个单位了,于是样例答案就变成了3..害我调好久,还以为样例错了 对于每头奶牛,我们求出它经过\(y\)轴的时间段,然后离散化一下,将奶牛按照从低到高 ...

  9. maven上传jar包到nexus私服后的存放路径 以及 使用IDEA上传jar包的步骤

    maven上传jar包到nexus私服的方法,网上大神详解很多,那么上传后的jar包存放到哪里了呢? 在下使用nexus3.2.1版本,在本地搭建了私服,使用maven上传jar包.最后结果如下: 点 ...

  10. c++11 追踪返回类型

    c++11 追踪返回类型 返回类型后置:使用"->"符号,在函数名和参数列表后面指定返回类型. #define _CRT_SECURE_NO_WARNINGS #includ ...