flask的上下文的机理与应用(转载+整理)
请求上下文面向开发者使用的对象主要是request和session;
应用上下文面向开发者使用的对象主要是current_app和g;
#--------------------------------------------------------------------------------------------------------------------------
所谓的上下文,应用上,个人理解,其实就是一个作用域的问题.
request获取的是发送请求的时候,"发送请求方"携带的信息,具体例子可以参考[13]
session是用来存储form中提供的一些数据的,这些数据往往来自用户的输入,所以也经常有资料说:"避免表单的重复提交"[14]
session 是可以跨 request 使用的,session 的数据是经过加密后存储在 cookie 里的,用户每次 request 都会把这些 cookie 信息发回来,从而实现跨 request 使用。
g 是面向单个 request 的,一个 request 处理完,g 里的东西就没了。[15]
可以将g对象看做dict的数据结构,它支持g.ab方式获取值和赋值。
current_app其实"没啥用",而是隐式用到的,代码如下[16]:
from flask import Flask, current_appapp = Flask(__name__)
print(app) #输出结果:<Flask '1_current_app'>
其余三种的机制如下图展示[5]:
g不能跨请求
session可以跨请求,
request是用来解析请求内容的.
然后他们三者都是在WSGI以后,才被我们使用到的.
current_app不会被显式用到,就不管了.
#---------------------------------------------------------------------------------------------------------
[1]显示了上下文为什么用栈,但是代码有些牵强.
[2]没啥用,[3]提到,g可以当做一个dict来使用
[4][7][8][9][10][11]都是讲钩子的
[5]的出栈入栈没讲清楚
#----------------------------------------------------------------------------------------------------
举例:
Flask中new一个对象就是堆,
使用了上下文就是栈,
之所以Flask的上下文需要用到栈,多app存在于单个线程中,
一个线程默认情况下只能用同一个栈
需要使用上下文+栈的例子
from flask import Flask,current_app
from werkzeug.wsgi import DispatcherMiddleware
from werkzeug.serving import run_simpleapp1 = Flask("app01")
app2 = Flask("app02")@app1.route("/index1")
def index1():print(current_app)return "index1"@app2.route("/index2")
def index2():print(current_app)return "index2"app = DispatcherMiddleware(app1,{'/sec':app2
})
if __name__ == '__main__':run_simple('localhost',5000,app,)
python hello.py
浏览器打开:
http://localhost/index1
http://localhost/sec/index2
根据[17]:
离线测试需要app context 和Request Context分离。
栈用来确保处理的“当前的”的app上下文在栈顶
#-------------------------------------------附录---------------------------------------------------------
首先,讨论的堆和栈指的是内存中的“堆区”和“栈区”,OC语言是C语言的超集,所以先了解C语言的内存模型的内存管理会有很大的帮助。C语言的内存模型分为5个区:栈区、堆区、静态区、常量区、代码区。每个区存储的内容如下:
1、栈区:存放函数的参数值、局部变量等,由编译器自动分配和释放,通常在函数执行完后就释放了,其操作方式类似于数据结构中的栈。栈内存分配运算内置于CPU的指令集,效率很高,但是分配的内存量有限,比如iOS中栈区的大小是2M。
2、堆区:就是通过new、malloc、realloc分配的内存块,编译器不会负责它们的释放工作,需要用程序区释放。分配方式类似于数据结构中的链表。在iOS开发中所说的“内存泄漏”说的就是堆区的内存。
3、静态区:全局变量和静态变量(在iOS中就是用static修饰的局部变量或者是全局全局变量)的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后,由系统释放。
4、常量区:常量存储在这里,不允许修改。
5、代码区:存放函数体的二进制代码。
堆和栈的区别:
1、堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存。当然,iOS引入了ARC(自动引用计数管理技术)之后,程序员就不需要用代码管理对象的内存了,之前MRC(手动管理内存)的时候,程序员需要手动release对象。另外,ARC只是一种中间层的技术,虽然在ARC模式下,程序员不需要像之前那么麻烦管理内存,但是需要遵循ARC技术的规范操作,比如使用属性限定符weak、strong、assigen等。因此,如果程序员没有按ARC的规则并合理的使用这些属性限定符的话,同样是会造成内存泄漏的。
2、栈空间的内存是由系统自动分配,一般存放局部变量,比如对象的地址等值,不需要程序员对这块内存进行管理,比如,函数中的局部变量的作用范围(生命周期)就是在调完这个函数之后就结束了。这些在系统层面都已经限定住了,程序员只需要在这种约束下进行程序编程就好,根本就没有把这块内存的管理权给到程序员,肯定也就不存在让程序员管理一说。
从申请的大小方面讲:
栈空间比较小;
堆空间比较大。
从数据存储方面来说:
栈空间中一般存储基本数据类型,对象的地址;
堆空间一般存放对象本身,block的copy等。
Reference:
[1]flask源码解析之上下文为什么用栈
[2]Flask快速入门(14) — 请求上下文2
[3]flask基础之AppContext应用上下文和RequestContext请求上下文(六)
[4]应用上下文-官方手册
[5]flask请求和应用上下文
[6]flask插件系列之flask_session会话机制
[7]Flask常用的钩子函数
[8]Flask框架钩子函数使用方式及应用场景分析
[9]flask钩子函数的作用
[10]Flask系列教程(31)——Flask上下文
[11]flask基础之请求钩子(十二)
[12]Flask框架从入门到精通之上下文(二十三)
[13]从零开始学Python Flask Web(四)--Flask Request请求
[14]HttpSession解决表单的重复提交
[15]flask 的 g 和session 的区别怎样理解
[16]flask之current_app的使用及详解
[17]深入理解Flask中的上下文
flask的上下文的机理与应用(转载+整理)相关推荐
- Flask的上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- Flask框架——上下文、flask_script扩展
目录 上下文(引用池,引用区) flask_script扩展 上下文(引用池,引用区) 上下文:相当于一个容器,保存了 Flask 程序运行过程中的一些信息. 为了避免大量可有可无的参数把视图函数弄得 ...
- python Flask 10 Flask请求上下文管理werkzeug
什么是上下文 上下文相当于一个容器,保存了 Flask 程序运行过程中的一些信息. Flask 中有两种上下文,请求上下文(request 和 session )和应用上下文(current_a ...
- PPT制作--这不是技巧,而是常识 然而好多人并不知道 (hsyl007转载整理)
<hsyl007转载整理--hsyl007学习笔记收集整理 ,个人博客地址 http://hsyl007.work/zblog/> 这篇文章是我对PPT进行主题阅读的一个尝试,主题阅 ...
- fragment怎么获得上下文环境_Flask 源码剖析 (三):Flask 的上下文机制 (上)
写文章其实很费力,你的「在看」很重要. 前言 在面试 Python web 方面的工作时,如果你说自己阅读过 Flask 源码,那么 Flask 上下文机制的实现原理肯定会被问到,本篇文章就来剖析一下 ...
- Flask 应用上下文
上下文管理 threading.local 请求上下文:RequstContext request session 应用上下文:AppContext app(current_app) g 1.请求到来 ...
- [转载 整理]C语言链表实例
C语言链表有单链表.双向链表.循环链表.单链表由数据域和指针域组成,数据域存放数据,指针域存放该数据类型的指针便于找到下一个节点.双链表则含有头指针域.数据域和尾指针域,域单链表不同,双链表可以从后一 ...
- [转载] 整理下java中stringBuilder和stringBuffer两个类的区别
参考链接: Java中的StringBuffer类 StringBuilder和StringBuffer这两个类在动态拼接字符串时常用,肯定比String的效率和开销小,这是因为String的对象不会 ...
- [转](转载+整理)超详细的cmake教程
cmake教程 参考 什么是cmake cmake 常见语法罗列 CMake可用变量 入门案例 单个源文件 多个源文件 同一目录,多个源文件 多个目录,多个源文件 进阶案例 自定义编译选项 指定安装和 ...
最新文章
- layui 数据表格内容过长遮挡_word表格技巧:遇到这三种情况,你会处理么?
- 【项目经理应该知道的97件事】三位一体的项目管理
- 信息安全系统设计基础学习总结第二周
- mysql 多表联查的效率_Mysql 多表联合查询效率分析
- 加载中...loading... 图片_搞笑图片:小子这就是你单身的原因...
- 协议森林01 邮差与邮局 (网络协议概观)
- 内核链表list.h文件剖析
- netty 支持多种通讯协议
- logstash 使用glusterfs网络存储偶发性文件解析异常的问题
- 万年历24节气C语言,电子万年历24节气c程序
- alter table add column多个字段_element中el-table单行暂无数据和整体暂无数据的默认修改...
- MySQL(17)-----数值函数
- 阿里天猫小镇的实质就是为了圈地!
- 2022年烟花爆竹经营单位安全管理人员培训试题及模拟考试
- MTK LK阶段 display框架
- 视频接入AI平台技术方案
- 基于EEG信号与面部表情的连续情绪识别
- java实现手机尾号评分
- 一个字符串截取函数c语言
- LPC17XX系列ISP升级流程