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的几条建议分享
Feb 10 Python
Python实现批量下载文件
May 17 Python
Python对数据库操作
Mar 28 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
利用python微信库itchat实现微信自动回复功能
May 18 Python
Python实现的读写json文件功能示例
Jun 05 Python
基于DATAFRAME中元素的读取与修改方法
Jun 08 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
Jul 17 Python
python pygame实现球球大作战
Nov 25 Python
Python 装饰器原理、定义与用法详解
Dec 07 Python
python中对二维列表中一维列表的调用方法
Jun 07 Python
PyTorch安装与基本使用详解
Aug 31 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
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
JavaScript While 循环基础教程
2007/04/05 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
jquery按回车提交数据的代码示例
2013/11/05 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
TypeScript入门-接口
2017/03/30 Javascript
探讨Vue.js的组件和模板
2017/10/27 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
详解常用查找数据结构及算法(Python实现)
2016/12/09 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
python微信跳一跳游戏辅助代码解析
2018/01/29 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
python ETL工具 pyetl
2020/06/07 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
找到不普通的东西:Bonanza
2016/10/20 全球购物
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
学年自我鉴定
2014/01/16 职场文书
新闻编辑求职信
2014/04/09 职场文书
设备管理实施方案
2014/05/31 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
美丽人生观后感
2015/06/03 职场文书
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python