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爬虫模拟登录带验证码网站
Jan 22 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
Apr 15 Python
python3操作微信itchat实现发送图片
Feb 24 Python
详解python3中zipfile模块用法
Jun 18 Python
Python3 读、写Excel文件的操作方法
Oct 20 Python
对python的unittest架构公共参数token提取方法详解
Dec 17 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
django迁移数据库错误问题解决
Jul 29 Python
python 接口实现 供第三方调用的例子
Aug 13 Python
详解Python IO编程
Jul 24 Python
Python爬虫之爬取最新更新的小说网站
May 06 Python
详解Python牛顿插值法
May 11 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
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
php原生导出excel文件的两种方法(推荐)
2016/11/19 PHP
用JQuery调用Session的实现代码
2010/10/29 Javascript
浅析javascript闭包 实例分析
2010/12/25 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
javaScript复制功能调用实现方案
2012/12/13 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
2013/05/30 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
vue实现在线翻译功能
2019/09/27 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
Python实现字典的遍历与排序功能示例
2017/12/23 Python
用python实现百度翻译的示例代码
2018/03/09 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
python求前n个阶乘的和实例
2020/04/02 Python
CSS3样式linear-gradient的使用实例
2017/01/16 HTML / CSS
印度在线杂货店:bigbasket
2018/08/23 全球购物
eVitamins日本:在线购买折扣维生素、补品和草药
2019/04/04 全球购物
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
抽样调查项目计划书
2014/04/24 职场文书
党员活动日总结
2014/05/05 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
使用Redis做预定库存缓存功能
2022/04/02 Redis
Python自动化实战之接口请求的实现
2022/05/30 Python