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实现读取目录所有文件的文件名并保存到txt文件代码
Nov 22 Python
Python实现线程池代码分享
Jun 21 Python
python和flask中返回JSON数据的方法
Mar 26 Python
python操作excel的方法(xlsxwriter包的使用)
Jun 11 Python
Django组件之cookie与session的使用方法
Jan 10 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
用python解压分析jar包实例
Jan 16 Python
python3连接MySQL8.0的两种方式
Feb 17 Python
Python列表切片常用操作实例解析
Mar 10 Python
使用OpenCV实现道路车辆计数的使用方法
Jul 15 Python
Python configparser模块应用过程解析
Aug 14 Python
python模拟点击在ios中实现的实例讲解
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
php登陆页的密码处理方式分享
2013/10/14 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
Nigma vs Liquid BO3 第一场2.14
2021/03/10 DOTA
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
编写自己的jQuery插件简单实现代码
2011/04/19 Javascript
jquery获取元素索引值index()示例
2014/02/13 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
javascript+canvas制作九宫格小程序
2014/12/28 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
Vue文件配置全局变量的实例
2018/09/06 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
解决layer弹出层中表单不起作用的问题
2019/09/09 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
Python格式化日期时间操作示例
2018/06/28 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
Python变量访问权限控制详解
2019/06/29 Python
python画蝴蝶曲线图的实例
2019/11/21 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
Python进行统计建模
2020/08/10 Python
如何使用scrapy中的ItemLoader提取数据
2020/09/30 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
建筑总经理岗位职责
2014/02/02 职场文书
公司人事管理制度
2015/08/05 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL