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 04 Python
python获取指定目录下所有文件名列表的方法
May 20 Python
Python回调函数用法实例详解
Jul 02 Python
深入理解python中的闭包和装饰器
Jun 12 Python
浅谈Python使用Bottle来提供一个简单的web服务
Dec 27 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
Apr 10 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
基于随机梯度下降的矩阵分解推荐算法(python)
Aug 31 Python
python tkinter窗口最大化的实现
Jul 15 Python
Sentry错误日志监控使用方法解析
Nov 12 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
如何在Python中妥善使用进度条详解
Apr 05 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 static局部静态变量和全局静态变量总结
2014/03/02 PHP
php操作MongoDB类实例
2015/06/17 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
php compact 通过变量创建数组
2016/11/15 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
javascript fullscreen全屏实现代码
2009/04/09 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
jQuery实现带玻璃流光质感的手风琴特效
2015/11/20 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
js实现简单掷骰子小游戏
2019/10/24 Javascript
vue 解决computed修改data数据的问题
2019/11/06 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
[53:49]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
Python----数据预处理代码实例
2019/03/20 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
网站创业计划书
2014/04/30 职场文书
市场营销战略计划书
2014/05/06 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
学校食堂管理制度
2015/08/04 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书