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 21 Python
Python 爬虫学习笔记之单线程爬虫
Sep 21 Python
Python处理PDF及生成多层PDF实例代码
Apr 24 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
Jun 27 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
Dec 28 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
Jun 21 Python
python实现ip代理池功能示例
Jul 05 Python
简单的Python调度器Schedule详解
Aug 30 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
解决python DataFrame 打印结果不换行问题
Apr 09 Python
在ipython notebook中使用argparse方式
Apr 20 Python
keras 如何保存最佳的训练模型
May 25 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 insert语法详解
2008/06/07 PHP
php adodb连接mssql解决乱码问题
2009/06/12 PHP
php HtmlReplace输入过滤安全函数
2010/07/03 PHP
PHP 事件机制(2)
2011/03/23 PHP
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
PHP简单遍历对象示例
2016/09/28 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
Python命名空间详解
2014/08/18 Python
python进阶教程之循环对象
2014/08/30 Python
python概率计算器实例分析
2015/03/25 Python
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
学生信息管理系统python版
2018/10/17 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
python网络应用开发知识点浅析
2019/05/28 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
2019/07/30 Python
django 读取图片到页面实例
2020/03/27 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
什么是数据抽象
2016/11/26 面试题
关于梦想的演讲稿
2014/05/05 职场文书
党员证明模板
2015/06/19 职场文书
致运动员加油稿
2015/07/21 职场文书
母亲节主题班会
2015/08/14 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript