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多进程同步简单实现代码
Apr 27 Python
Python 绘图和可视化详细介绍
Feb 11 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
Jul 12 Python
pip install python 快速安装模块的教程图解
Oct 08 Python
Java文件与类动手动脑实例详解
Nov 10 Python
关于tf.reverse_sequence()简述
Jan 20 Python
Python RabbitMQ实现简单的进程间通信示例
Jul 02 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
Aug 07 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 Python
Python字典和列表性能之间的比较
Jun 07 Python
Python中22个万用公式的小结
Jul 21 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
php学习之 数组声明
2011/06/09 PHP
php cc攻击代码与防范方法
2012/10/18 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
childNodes.length与children.length的区别
2009/05/14 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
python操作MySQL数据库的方法分享
2012/05/29 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
python能自学吗
2020/06/18 Python
python解释器安装教程的方法步骤
2020/07/02 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
小学生班会演讲稿
2014/01/09 职场文书
股权投资意向书
2014/04/01 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
python高温预警数据获取实例
2022/07/23 Python