Flask之请求钩子的实现


Posted in Python onDecember 23, 2018

请求钩子

通过装饰器为一个模块添加请求钩子, 对当前模块的请求进行额外的处理. 比如权限验证.

说白了,就是在执行视图函数前后你可以进行一些处理,Flask使用装饰器为我们提供了注册通用函数的功能。

1、before_first_request:在处理第一个请求前执行

before_first_request

在对应用程序实例的第一个请求之前注册要运行的函数, 只会执行一次

#: A lists of functions that should be called at the beginning of the
  #: first request to this instance. To register a function here, use
  #: the :meth:`before_first_request` decorator.
  #:
  #: .. versionadded:: 0.8
  self.before_first_request_funcs = []

  @setupmethod
  def before_first_request(self, f):
    """Registers a function to be run before the first request to this
    instance of the application.

    .. versionadded:: 0.8
    """
    self.before_first_request_funcs.append(f)

将要运行的函数存放到before_first_request_funcs 属性中进行保存

2、before_request:在每次请求前执行

在每个请求之前注册一个要运行的函数, 每一次请求都会执行

#: A dictionary with lists of functions that should be called at the
  #: beginning of the request. The key of the dictionary is the name of
  #: the blueprint this function is active for, `None` for all requests.
  #: This can for example be used to open database connections or
  #: getting hold of the currently logged in user. To register a
  #: function here, use the :meth:`before_request` decorator.
  self.before_request_funcs = {} 

  @setupmethod
  def before_request(self, f):
    """Registers a function to run before each request."""
    self.before_request_funcs.setdefault(None, []).append(f)
    return f

将要运行的函数存放在字典中, None 为键的列表中存放的是整个应用的所有请求都要运行的函数.

3、after_request:每次请求之后调用,前提是没有未处理的异常抛出

在每个请求之后注册一个要运行的函数, 每次请求都会执行. 需要接收一个 Response 类的对象作为参数 并返回一个新的Response 对象 或者 直接返回接受到的Response 对象

#: A dictionary with lists of functions that should be called after
  #: each request. The key of the dictionary is the name of the blueprint
  #: this function is active for, `None` for all requests. This can for
  #: example be used to open database connections or getting hold of the
  #: currently logged in user. To register a function here, use the
  #: :meth:`after_request` decorator.
  self.after_request_funcs = {}

  @setupmethod
  def after_request(self, f):
    """Register a function to be run after each request. Your function
    must take one parameter, a :attr:`response_class` object and return
    a new response object or the same (see :meth:`process_response`).

    As of Flask 0.7 this function might not be executed at the end of the
    request in case an unhandled exception occurred.
    """
    self.after_request_funcs.setdefault(None, []).append(f)
    return f

4、teardown_request:每次请求之后调用,即使有未处理的异常抛出

注册一个函数在每个请求的末尾运行,不管是否有异常, 每次请求的最后都会执行.

#: A dictionary with lists of functions that are called after
  #: each request, even if an exception has occurred. The key of the
  #: dictionary is the name of the blueprint this function is active for,
  #: `None` for all requests. These functions are not allowed to modify
  #: the request, and their return values are ignored. If an exception
  #: occurred while processing the request, it gets passed to each
  #: teardown_request function. To register a function here, use the
  #: :meth:`teardown_request` decorator.
  #:
  #: .. versionadded:: 0.7
  self.teardown_request_funcs = {}

  @setupmethod
  def teardown_request(self, f):
    """Register a function to be run at the end of each request,
    regardless of whether there was an exception or not. These functions
    are executed when the request context is popped, even if not an
    actual request was performed.
    """
    self.teardown_request_funcs.setdefault(None, []).append(f)
    return f

将要运行的函数存放在字典中, None 为键的列表中存放的是整个应用的所有请求都要运行的函数.

from flask import Flask
app = Flask(__name__)

@app.before_first_request
def before_first_request():
  print('before_first_request')


@app.before_request
def before_request():
  print('before_request')


@app.after_request
def after_request(resp):
  print('after_request')
  return resp


@app.teardown_request
def teardown_request(e):
  print('teardown_request')


@app.route("/")
def view_fn():
  return "view_fn"
  
if __name__ == "__main__":
  app.run()

第一次请求:

页面输出:view_fn
控制台输出: before_first_request
            before_request
            after_request
            teardown_request

第二次请求:

页面输出:view_fn
控制台输出: before_request
            after_request
            teardown_request

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现得到一个给定类的虚函数
Sep 28 Python
Python字符串处理函数简明总结
Apr 13 Python
python如何在终端里面显示一张图片
Aug 17 Python
更改Ubuntu默认python版本的两种方法python-> Anaconda
Dec 18 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
对python抓取需要登录网站数据的方法详解
May 21 Python
详解使用Python下载文件的几种方法
Oct 13 Python
Python如何通过Flask-Mail发送电子邮件
Jan 29 Python
Python Merge函数原理及用法解析
Sep 16 Python
基于Python实现全自动下载抖音视频
Nov 06 Python
python 写一个文件分发小程序
Dec 05 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
Jul 07 Python
python爬虫获取新浪新闻教学
Dec 23 #Python
Python爬虫文件下载图文教程
Dec 23 #Python
python爬虫获取百度首页内容教学
Dec 23 #Python
Python爬虫设置代理IP(图文)
Dec 23 #Python
celery4+django2定时任务的实现代码
Dec 23 #Python
python3使用pandas获取股票数据的方法
Dec 22 #Python
Python实现将通信达.day文件读取为DataFrame
Dec 22 #Python
You might like
PHP下几种删除目录的方法总结
2007/08/19 PHP
开源SNS系统-ThinkSNS
2008/05/18 PHP
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
php获取淘宝分类id示例
2014/01/16 PHP
PHP生成条形图的方法
2014/12/10 PHP
浅谈php冒泡排序
2014/12/30 PHP
php强制用户转向www域名的方法
2015/06/19 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
详解写好JS条件语句的5条守则
2019/02/28 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
js实现省级联动(数据结构优化)
2020/07/17 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
python 循环while和for in简单实例
2016/08/16 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
css3弹性盒子flex实现三栏布局的实现
2020/11/12 HTML / CSS
《纸船和风筝》教学反思
2014/02/15 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
同事去世追悼词
2015/06/23 职场文书
同学会演讲稿
2019/04/02 职场文书
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏