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字符串处理函数简明总结
Apr 13 Python
Python 中开发pattern的string模板(template) 实例详解
Apr 01 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
django DRF图片路径问题的解决方法
Sep 10 Python
Python一键安装全部依赖包的方法
Aug 12 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
通过python实现windows桌面截图代码实例
Jan 17 Python
python语言的优势是什么
Jun 17 Python
详细分析Python垃圾回收机制
Jul 01 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 Python
python分布式爬虫中消息队列知识点详解
Nov 26 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
采用memcache在web集群中实现session的同步会话
2014/07/05 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
round robin权重轮循算法php实现代码
2016/05/28 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
一段实时更新的时间代码
2006/07/07 Javascript
jquery 选项卡效果 新手代码
2011/07/08 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
js获取ip和地区
2017/03/10 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
TensorFlow实现Softmax回归模型
2018/03/09 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
python实现的config文件读写功能示例
2019/09/24 Python
基于python实现从尾到头打印链表
2019/11/02 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
python 实现超级玛丽游戏
2020/11/25 Python
HTTP状态码详解
2021/03/18 杂记
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
机械设计及其自动化专业推荐信
2013/10/31 职场文书
关于感恩的演讲稿400字
2014/08/26 职场文书
技术员岗位职责范本
2015/04/11 职场文书
保留意见审计报告
2015/06/05 职场文书
初中数学教学随笔
2015/08/15 职场文书