flask框架中勾子函数的使用详解


Posted in Python onAugust 01, 2018

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:

  • 在请求开始时,建立数据库连接;
  • 在请求开始时,根据需求进行权限校验;
  • 在请求结束时,指定数据的交互格式;

为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。

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

  • before_first_request
    • 在处理第一个请求前执行
  • before_request
    • 在每次请求前执行
    • 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
  • after_request
    • 如果没有抛出错误,在每次请求后执行
    • 接受一个参数:视图函数作出的响应
    • 在此函数中可以对响应值在返回之前做最后一步修改处理
    • 需要将参数中的响应在此参数中进行返回
  • teardown_request
    • 在每次请求后执行
    • 接受一个参数:错误信息,如果有相关错误抛出

代码测试

from flask import Flask
from flask import abort

app = Flask(__name__)


# 在第一次请求之前调用,可以在此方法内部做一些初始化操作
@app.before_first_request
def before_first_request():
  print("before_first_request")


# 在每一次请求之前调用,这时候已经有请求了,可能在这个方法里面做请求的校验
# 如果请求的校验不成功,可以直接在此方法中进行响应,直接return之后那么就不会执行视图函数
@app.before_request
def before_request():
  print("before_request")
  # if 请求不符合条件:
  #   return "laowang"


# 在执行完视图函数之后会调用,并且会把视图函数所生成的响应传入,可以在此方法中对响应做最后一步统一的处理
@app.after_request
def after_request(response):
  print("after_request")
  response.headers["Content-Type"] = "application/json"
  return response


# 请每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息
@app.teardown_request
def teardown_request(e):
  print("teardown_request")


@app.route('/')
def index():
  return 'index'

if __name__ == '__main__':
  app.run(debug=True)

在第1次请求时的打印:
before_first_request
before_request
after_request
teardown_request

在第2次请求时的打印:
before_request
after_request
teardown_request

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现在目录中查找指定文件的方法
Nov 11 Python
python通过装饰器检查函数参数数据类型的方法
Mar 13 Python
python 爬取微信文章
Jan 30 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
python中将字典形式的数据循环插入Excel
Jan 16 Python
Python实现端口检测的方法
Jul 24 Python
Python分布式进程中你会遇到的问题解析
May 28 Python
详解PyCharm安装MicroPython插件的教程
Jun 24 Python
python内存动态分配过程详解
Jul 15 Python
python MultipartEncoder传输zip文件实例
Apr 07 Python
python如何输出反斜杠
Jun 18 Python
Python自省及反射原理实例详解
Jul 06 Python
flask中过滤器的使用详解
Aug 01 #Python
Python拼接微信好友头像大图的实现方法
Aug 01 #Python
Python Flask前后端Ajax交互的方法示例
Jul 31 #Python
Python常见内置高效率函数用法示例
Jul 31 #Python
Python使用jsonpath-rw模块处理Json对象操作示例
Jul 31 #Python
flask-socketio实现WebSocket的方法
Jul 31 #Python
深入flask之异步非堵塞实现代码示例
Jul 31 #Python
You might like
广播爱好者需要了解的天线知识
2021/03/01 无线电
PHP实现的简单日历类
2014/11/29 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
jQuery性能优化的38个建议
2014/03/04 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
JS实现的RC4加密算法示例
2018/08/16 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
python multiprocessing多进程变量共享与加锁的实现
2019/10/02 Python
numpy.array 操作使用简单总结
2019/11/08 Python
Pytoch之torchvision.transforms图像变换实例
2019/12/30 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
德国柯吉澳趣味家居:Koziol
2017/08/24 全球购物
财务管理专业应届毕业生求职信
2013/09/22 职场文书
学生打架检讨书
2014/02/14 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
世界环境日活动总结
2015/02/11 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书
教师素质教育心得体会
2016/01/19 职场文书
创业计划书详解
2019/07/19 职场文书