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求众数问题实例
Sep 26 Python
python按照多个字符对字符串进行分割的方法
Mar 17 Python
Python yield 使用浅析
May 28 Python
Python list操作用法总结
Nov 10 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
PIL对上传到Django的图片进行处理并保存的实例
Aug 07 Python
关于Python3 类方法、静态方法新解
Aug 30 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
PyCharm第一次安装及使用教程
Jan 08 Python
在 Python 中接管键盘中断信号的实现方法
Feb 04 Python
Python基础知识学习之类的继承
May 31 Python
Python+Selenium实现读取网易邮箱验证码
Mar 13 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
smarty内置函数capture用法分析
2015/01/22 PHP
php获取YouTube视频信息的方法
2015/02/11 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
js 作用域和变量详解
2017/02/16 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
js实现无缝轮播图
2020/03/09 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
Python中title()方法的使用简介
2015/05/20 Python
Python简单调用MySQL存储过程并获得返回值的方法
2015/07/20 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
python遍历序列enumerate函数浅析
2017/10/17 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
好的Python培训机构应该具备哪些条件
2018/05/23 Python
python 6行代码制作月历生成器
2020/09/18 Python
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
EJB的激活机制
2013/10/25 面试题
中层干部岗位职责
2013/12/18 职场文书
大一自我鉴定范文
2013/12/27 职场文书
数控技术专业毕业自荐书范文
2014/02/05 职场文书
分层教学实施方案
2014/03/19 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
2015年招聘工作总结
2014/12/12 职场文书
先进班组材料范文
2014/12/25 职场文书
生产车间管理制度
2015/08/04 职场文书