请求钩子(Hook)

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接;在请求结束时,指定数据的交互格式。为了让>每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。通过请求钩子,我们可以对请求进行预处理(preprocessing)和后处理>(postprocessing)。

Flask的请求钩子通过装饰器实现,每个钩子可以注册任意多个处理函数,默认的五种请求钩子如下:

钩子 说明
before_first_request 注册一个函数,在处理请求前运行
before_request 注册一个函数,在处理每个请求前运行
after_request 注册一个函数,如果有未处理的一场抛出。会在每个请求结束后运行
teardown_request 注册一个函数,即使有未处理的异常抛出,会在每个请求介绍后执行。如果发生异常,会传入异常对象作为参数注册到函数中
after_this_request 在视图函数内注册一个函数,在这个请求结束后运行

假如我们创建了三个视图函数A、B、C,其中视图C使用了after_this_request钩子,那么当请求A进入后,整个请求处理周期的请求处理函数调用流程如图:

上下文

什么是上下文?上下文相当于一个容器,它保存了程序运行过程中的一些信息,它是当前环境的一个快照(snapshot)。

Flask中有两种上下文,程序上下文(application context)和请求上下文(request context)。

程序上下文中包含了程序运行所必须的信息;请求上下文里包含了请求的各种信息,比如请求的URL、HTTP方法等

上下文全局变量

我们知道,Flask将请求报文封装在request对象中。按照一般的思路,如果我们要在视图函数中使用它,就得把它作为参数传入视图函数,就像我们接收URL变量一样。但这样就会导致大量的重复,而且增加了的程序的负担。

不一般的是,我们可以从Flask导入一个全局的request变量,在视图函数中直接调用request的属性获取数据。这是为什么?因为Flask会在每个请求产生后后自动激活当前请求的上下文,激活请求上下文后,request被临时设置为全局可访问。在每个请求结束后,Flask就会销毁对应的请求上下文。

Flask提供的四个上下文全局变量如下:

变量名 上下文类别 说明
current_app 程序上下文 指向处理请求的当前程序实例
g 程序上下文 替代Python的全局变量用法,确保仅在当前请求可用,用于存储全局数据,每次请求都会重设
request 请求上下文 封装客户端发出的请求报文数据
session 请求上下文 用于记住请求之间的数据,通过签名的Cookie实现
  • 不同的视图函数中,request对象都表示和视图函数对应的请求,也就是当前请求
  • 程序存在多个程序实例的情况,使用current_app可获取对应的实例

上下文的激活

请求进入时,Flask会自动激活请求上下文,此时程序上下文也被自动激活。请求处理完毕后,请求上下文和程序上下文也会自动销毁。两者具有相同的生命周期。

  • Flask自动激活上下文的情况:

    • 使用flask run命令启动程序时
    • 使用旧的app.run()方法启动程序时
    • 执行使用@app.cli.command()装饰器注册的flask命令时
    • 使用flask shell命令启动Python Shell时
  • 手动激活的方法:

    • 使用with语句,程序上下文对象可通过app.app_context()获取
    • 使用push()方法激活程序上下文
    • 请求上下文可以通过test_request_context()方法临时创建
>>> from app import app
>>> from flask import current_app
>>> with app.app_context():
... current_app.name
'app'
>>> from app import app
>>> from flask import current_app
>>> app_ctx = app.app_context()
>>> app_ctx.push()
>>> current_app.name
'app'
>>> app_ctx.pop()
>>> from app import app
>>> from flask import request
>>> with app.test_request_context('/hello'):
... request.method
'GET'

参考:https://book.douban.com/subject/30310340/

Flask的请求钩子与上下文简览的更多相关文章

  1. flask 之 请求钩子

    请求钩子 什么是请求钩子? 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子. f ...

  2. Flask之 请求,应用 上下文源码解析

    什么是上下文? 每一段程序都有很多外部变量.只有像Add这种简单的函数才是没有外部变量的.一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行.你为了使他们运行,就要给所有的外部变量一个一个写 ...

  3. Flask 中请求钩子的理解和应用?

    请求钩子是通过装饰器的形式实现的,支持以下四种:1,before_first_request 在处理第一个请求前运行2,before_request:在每次请求前运行3,after_request:如 ...

  4. flask之请求钩子

    from flask import Flask from flask import abort app = Flask(__name__) # 在第一次请求之前调用,可以在此方法内部做一些初始化操作 ...

  5. flask基础之请求钩子(十二)

    前言 什么是请求钩子?在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子. 请求钩子 ...

  6. 02 flask 请求钩子、异常捕获、上下文、Flask-Script 扩展、jinja2 模板引擎、csrf防范

    一 请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个 ...

  7. Flask框架 之上下文、请求钩子与Flask_Script

    一.上下文 请求上下文:request与session 应用上下文:current_app与g:一次请求多个函数可以用它传参 @app.route("/") def index() ...

  8. (三)flask中的请求钩子函数

    请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图 ...

  9. python 全栈开发,Day139(websocket原理,flask之请求上下文)

    昨日内容回顾 flask和django对比 flask和django本质是一样的,都是web框架. 但是django自带了一些组件,flask虽然自带的组件比较少,但是它有很多的第三方插件. 那么在什 ...

随机推荐

  1. 搭建springboot的ssm(spring + springmvc + mybatis)的maven项目

    最终项目目录结构 创建过程 1.创建开关SpringBootApplication 为了创建快速.我们使用idea自带的创建springboot来创建结构,当然创建普通的web项目也是可以的.(使用e ...

  2. Element-UI中关于table表格的样式操作

    项目中使用到element-ui组件库,经常需要操作表格,编辑样式的过程中遇到一些问题,官网针对table给出了很多的api,自己可以自定义,基本能满足产品需求,但是没有给出具体的案例,网上的资料也比 ...

  3. 十 Restful风格

    1 restful风格化,url上的参数通过{}点符绑定,RequestMapping("item/{id}") 2 点位符参数名与方法参数名不一致时,通过@PathVariabl ...

  4. 2_05_MSSQL课程_查询_where,group by,having的区别以及内连接、案例练习

    SQL查询顺序 select distinct/top ..._ (5) 投影 from_(1)找到表  where_ (2)过滤掉我们不需要的数据    group by_ (3)分组操作    h ...

  5. 如何在cmd中连接数据库

    数据库连接时遇到的问题 : https://www.cnblogs.com/xyzdw/archive/2011/08/11/2135227.htmlping +ip地址: 查看本机ip:ipconf ...

  6. Metasploit学习笔记——社会工程学

    1.社会工程学攻击案例——伪装木马 Linux命令终端输入命令msfvenom -l payloads用来列出攻击载荷,grep命令用来查询所需要的攻击载荷,条件是windows系统.要有回连至监听主 ...

  7. yarn container 的日志路径

    /etc/hadoop/conf/yarn-site.xml 配置文件中 - yarn.nodemanager.log-dirs 指定本机的日志路径 (/hadoopfs/fs1/yarn/nodem ...

  8. pyhon 内置函数

    chr()   asci码 dir()  目录,显示目录. divmod(10,3)   返回商和余数   例如  (3, 1)   返回的为一个元组    可以用于分页 enumerate()    ...

  9. JAVA开源爬虫列表及简介

    本文列举了一些较为常用的JAVA开源爬虫框架: 1.Apache Nutch 官方网站:http://nutch.apache.org/ 是否支持分布式:是 可扩展性:中.Apache Nutch并不 ...

  10. 51nod 1445:变色DNA 最短路变形

    1445 变色DNA 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有一只特别的狼,它在每个夜晚会进行变色,研究发现 ...