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检测远程udp端口是否打开的方法
Mar 14 Python
在Django的session中使用User对象的方法
Jul 23 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
Jan 02 Python
python pandas dataframe 按列或者按行合并的方法
Apr 12 Python
详解Django-restframework 之频率源码分析
Feb 27 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
Apr 03 Python
python网络编程之多线程同时接受和发送
Sep 03 Python
Django中自定义查询对象的具体使用
Oct 13 Python
python中的Elasticsearch操作汇总
Oct 30 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
Python压缩模块zipfile实现原理及用法解析
Aug 14 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实现框架(一)
2006/10/09 PHP
PHP编实现程动态图像的创建代码
2008/09/28 PHP
php中拷贝构造函数、赋值运算符重载
2012/07/25 PHP
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
JS 对象介绍
2010/01/20 Javascript
基于jquery的气泡提示效果
2010/05/31 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
详解javascript遍历方式
2015/11/11 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
Python字符串处理函数简明总结
2015/04/13 Python
Python中用sleep()方法操作时间的教程
2015/05/22 Python
Python全局变量用法实例分析
2016/07/19 Python
Python实现的十进制小数与二进制小数相互转换功能
2017/10/12 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
python连接PostgreSQL过程解析
2020/02/09 Python
python绘制动态曲线教程
2020/02/24 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
介绍一下你对SOA的认识
2016/04/24 面试题
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
司法助理专业自荐书
2014/06/13 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
小学教师节活动总结
2015/03/20 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书