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有证书的加密解密实现方法
Nov 19 Python
python 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
Python基于pillow判断图片完整性的方法
Sep 18 Python
浅谈python jieba分词模块的基本用法
Nov 09 Python
Python使用tkinter库实现文本显示用户输入功能示例
May 30 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
python3 实现的对象与json相互转换操作示例
Aug 17 Python
Python读取YAML文件过程详解
Dec 30 Python
Python hashlib常见摘要算法详解
Jan 13 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 Python
Python 如何将integer转化为罗马数(3999以内)
Jun 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模拟HTTP认证
2006/10/09 PHP
php桌面中心(一) 创建数据库
2007/03/11 PHP
php 远程图片保存到本地的函数类
2008/12/08 PHP
PHP版 汉字转码的实现详解
2013/06/09 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
JQuery 学习技巧总结
2010/05/21 Javascript
JavaScript 布尔操作符解析  && || !
2012/08/10 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
浅谈angularjs依赖服务注入写法的注意点
2017/04/24 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
PyQt5实现五子棋游戏(人机对弈)
2020/03/24 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
Python流程控制语句的深入讲解
2020/06/15 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
scrapy-splash简单使用详解
2021/02/21 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
2014年公司迎新年活动方案
2014/02/24 职场文书
教师节演讲稿
2014/05/06 职场文书
团队激励口号
2014/06/06 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
攻击最高的10只幽灵系神奇宝贝,坚盾剑怪排第一,第五最为可怕
2022/03/18 日漫
OpenFeign实现远程调用
2022/08/14 Java/Android