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的文件类型
May 30 Python
python实现随机梯度下降法
Mar 24 Python
python3结合openpyxl库实现excel操作的实例代码
Sep 11 Python
Python使用combinations实现排列组合的方法
Nov 13 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
python pytest进阶之xunit fixture详解
Jun 27 Python
Pycharm远程调试原理及具体配置详解
Aug 08 Python
Python socket模块ftp传输文件过程解析
Nov 05 Python
pymysql的简单封装代码实例
Jan 08 Python
python实现飞机大战项目
Mar 11 Python
Python类和实例的属性机制原理详解
Mar 21 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 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 trim 去除空字符的定义与语法介绍
2010/05/31 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
PHP生成plist数据的方法
2015/06/16 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
javascript 多级checkbox选择效果
2009/08/20 Javascript
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
c#+jquery实现获取radio和checkbox的值
2020/09/12 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
React实现评论的添加和删除
2020/10/20 Javascript
Python实现从URL地址提取文件名的方法
2015/05/15 Python
在Python中处理时间之clock()方法的使用
2015/05/22 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
2019/01/29 Python
Python魔法方法详解
2019/02/13 Python
python中几种自动微分库解析
2019/08/29 Python
python实现实时视频流播放代码实例
2020/01/11 Python
python中类与对象之间的关系详解
2020/12/16 Python
移动web模拟客户端实现多方框输入密码效果【附代码】
2016/03/25 HTML / CSS
英国综合网上购物商城:The Hut
2018/07/03 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
《雨霖铃》教学反思
2014/02/22 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
植物生产学专业求职信
2014/08/08 职场文书
农村文化活动总结
2014/08/28 职场文书
销售人才自我评价范文
2014/09/27 职场文书
毕业实习证明范本
2015/06/16 职场文书