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 ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
Jun 10 Python
Python中使用ConfigParser解析ini配置文件实例
Aug 30 Python
python向已存在的excel中新增表,不覆盖原数据的实例
May 02 Python
对python requests的content和text方法的区别详解
Oct 11 Python
对IPython交互模式下的退出方法详解
Feb 16 Python
python添加菜单图文讲解
Jun 04 Python
pip 安装库比较慢的解决方法(国内镜像)
Oct 06 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
python ubplot使用方法解析
Jan 10 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
Mar 03 Python
python+OpenCV实现图像拼接
Mar 05 Python
python实现数字炸弹游戏
Jul 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
pw的一个放后门的方法分析
2007/10/08 PHP
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
php利用新浪接口查询ip获取地理位置示例
2014/01/20 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
jquery实现居中弹出层代码
2010/08/25 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
微信小程序 解析网页内容详解及实例
2017/02/22 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
Python中的一些陷阱与技巧小结
2015/07/10 Python
django框架自定义用户表操作示例
2018/08/07 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
Django-xadmin+rule对象级权限的实现方式
2020/03/30 Python
python 操作excel表格的方法
2020/12/05 Python
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
入党积极分子介绍信
2014/01/17 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python
python实现三阶魔方还原的示例代码
2021/04/28 Python
Python中的 Set 与 dict
2022/03/13 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python