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中的高级函数map/reduce使用实例
Apr 13 Python
python绘制双柱形图代码实例
Dec 14 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
Oct 31 Python
python实现一个简单的ping工具方法
Jan 31 Python
利用selenium爬虫抓取数据的基础教程
Jun 10 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
Dec 31 Python
python操作docx写入内容,并控制文本的字体颜色
Feb 13 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 23 Python
Python实战之大鱼吃小鱼游戏的实现
Apr 01 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
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
深入PHP5中的魔术方法详解
2013/06/17 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
2019/10/17 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
2017/01/06 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
JavaScript创建对象方法实例小结
2018/09/03 Javascript
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
Python中交换两个元素的实现方法
2018/06/29 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
python批量图片处理简单示例
2019/08/06 Python
Python异常处理机制结构实例解析
2020/07/23 Python
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
就业推荐表自我鉴定
2013/10/29 职场文书
个人安全承诺书
2014/05/22 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
毕业生个人自荐书
2015/03/05 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript
Pytorch数据读取之Dataset和DataLoader知识总结
2021/05/23 Python