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 18 Python
使用Python发送邮件附件以定时备份MySQL的教程
Apr 25 Python
详解python之简单主机批量管理工具
Jan 27 Python
Django入门使用示例
Dec 12 Python
在python中将字符串转为json对象并取值的方法
Dec 31 Python
python 实现检验33品种数据是否是正态分布
Dec 09 Python
PyTorch笔记之scatter()函数的使用
Feb 12 Python
pytorch实现从本地加载 .pth 格式模型
Feb 14 Python
如何在Windows中安装多个python解释器
Jun 16 Python
python中的django是做什么的
Jul 31 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
详解Python描述符的工作原理
Jun 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
php全角字符转换为半角函数
2014/02/07 PHP
php截取中文字符串函数实例
2015/02/23 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
php+js实现裁剪任意形状图片
2018/10/31 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
2019/10/17 PHP
jquery实现瀑布流效果分享
2014/03/26 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
2020/08/27 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
新闻上下滚动jquery 超简洁(必看篇)
2017/01/21 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
2017/10/13 jQuery
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
2017/12/18 Javascript
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
Vue组件创建和传值的方法
2018/08/17 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
python实现猜拳游戏
2020/03/04 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
一波HTML5 Canvas基础绘图实例代码集合
2016/02/28 HTML / CSS
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
启动仪式策划方案
2014/06/14 职场文书
学习十八大演讲稿
2014/09/15 职场文书
小学运动会开幕词
2015/01/28 职场文书
校长一岗双责责任书
2015/05/09 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
MySQL sql模式设置引起的问题
2022/05/15 MySQL