Flask框架中request、请求钩子、上下文用法分析


Posted in Python onJuly 23, 2019

本文实例讲述了Flask框架中request、请求钩子、上下文用法。分享给大家供大家参考,具体如下:

request

就是flask中代表当前请求的request对象:

常用的属性如下:

属性 说明 类型
data 记录请求的数据,并转换为字符串 *
form 记录请求中的表单数据 MultiDict
args 记录请求中的查询参数 MultiDict
cookies 记录请求中的cookie信息 Dict
headers 记录请求中的报文头 EnvironHeaders
method 记录请求使用的HTTP方法 GET/POST
url 记录请求的URL地址 string
files 记录请求上传的文件 *

请求勾子

flask的请求钩子其实跟django的中间件很类似。

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

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

  • before_first_request:在处理第一个请求前运行。
  • before_request:在每次请求前运行。
  • after_request:如果没有未处理的异常抛出,在每次请求后运行。
  • teardown_request:在每次请求后运行,即使有未处理的异常抛出。

装饰器路由的实现

Flask有两大核心:Werkzeug和Jinja2

- Werkzeug实现路由、调试和Web服务器网关接口
- Jinja2实现了模板。

Werkzeug是一个遵循WSGI协议的python函数库

- 其内部实现了很多Web框架底层的东西,比如request和response对象;
- 与WSGI规范的兼容;支持Unicode;
- 支持基本的会话管理和签名Cookie;
- 集成URL请求路由等。

Werkzeug库的routing模块负责实现URL解析。不同的URL对应不同的视图函数,routing模块会对请求信息的URL进行解析,匹配到URL对应的视图函数,以此生成一个响应信息。

routing模块内部有:

- Rule类(用来构造不同的URL模式的对象)
- Map类(存储所有的URL规则)
- BaseConverter的子类(负责定义匹配规则)
- MapAdapter类(负责具体URL匹配的工作)

上下文

上下文:相当于一个容器,保存了Flask程序运行过程中的一些信息。

Flask中有两种上下文,请求上下文和应用上下文。

请求上下文(request context)

Flask从客户端收到请求时,要让视图函数能访问一些对象,这样才能处理请求。请求对象是一个很好的例子,它封装了客户端发送的HTTP请求。

要想让视图函数能够访问请求对象,一个显而易见的方式是将其作为参数传入视图函数,不过这会导致程序中的每个视图函数都增加一个参数,除了访问请求对象,如果视图函数在处理请求时还要访问其他对象,情况会变得更糟。为了避免大量可有可无的参数把视图函数弄得一团糟,Flask使用上下文临时把某些对象变为全局可访问。

  • request 和 session 都属于请求上下文对象。
    • request:封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
    • session:用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息。
  • 当调用app = Flask(name)的时候,创建了程序应用对象app;
  • request 在每次http请求发生时,WSGI server调Flask.call();然后在Flask内部创建的request对象;
  • app的生命周期大于request,一个app存活期间,可能发生多次http请求,所以就会有多个request。
  • 最终传入视图函数,通过return、redirect或render_template生成response对象,返回给客户端。

应用上下文(application context)

它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓local proxy。它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。

应用上下文对象有:current_app,g

current_app

应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,例如:

  • 应用的启动脚本是哪个文件,启动时指定了哪些参数
  • 加载了哪些配置文件,导入了哪些配置
  • 连了哪个数据库
  • 有哪些public的工具类、常量
  • 应用跑再哪个机器上,IP多少,内存多大
current_app.name
current_app.test_value='value'

g变量

g作为flask程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别

g.name='abc'

两者区别:

请求上下文:保存了客户端和服务器交互的数据
应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等

请求上下文和应用上下文原理实现:https://segmentfault.com/a/1190000004223296

希望本文所述对大家基于flask框架的Python程序设计有所帮助。

Python 相关文章推荐
python实现的一个火车票转让信息采集器
Jul 09 Python
python制作websocket服务器实例分享
Nov 20 Python
go和python变量赋值遇到的一个问题
Aug 31 Python
python的socket编程入门
Jan 29 Python
python爬虫简单的添加代理进行访问的实现代码
Apr 04 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
python操作gitlab API过程解析
Dec 27 Python
Python 实现平台类游戏添加跳跃功能
Mar 27 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
python 如何读、写、解析CSV文件
Mar 03 Python
利用Matlab绘制各类特殊图形的实例代码
Jul 16 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 #Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 #Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 #Python
flask框架路由常用定义方式总结
Jul 23 #Python
python处理大日志文件
Jul 23 #Python
Django urls.py重构及参数传递详解
Jul 23 #Python
Django框架基础模板标签与filter使用方法详解
Jul 23 #Python
You might like
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
使用PHP会话(Session)实现用户登陆功能
2013/06/29 PHP
laravel http 自定义公共验证和响应的方法
2019/09/29 PHP
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
JS获取URL中的参数数据
2013/12/05 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
JavaScript无缝滚动效果的实例代码
2017/03/27 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
vue2.0获取鼠标位置的方法
2018/09/13 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
Vue2.0 $set()的正确使用详解
2020/07/28 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
Python实现队列的方法
2015/05/26 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
2019/05/27 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
全球性的在线购物网站:Zapals
2017/03/22 全球购物
大码女装:Ulla Popken
2019/08/06 全球购物
幼儿园校车司机的岗位职责
2014/01/30 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
优秀团员自我评价范文
2014/04/23 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
中层干部培训方案
2014/06/16 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫
SQL Server 中的事务介绍
2022/05/20 SQL Server