• 请求上下文面向开发者使用的对象主要是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的上下文的机理与应用(转载+整理)相关推荐

  1. Flask的上下文管理机制

    前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...

  2. Flask框架——上下文、flask_script扩展

    目录 上下文(引用池,引用区) flask_script扩展 上下文(引用池,引用区) 上下文:相当于一个容器,保存了 Flask 程序运行过程中的一些信息. 为了避免大量可有可无的参数把视图函数弄得 ...

  3. python Flask 10 Flask请求上下文管理werkzeug

    什么是上下文    上下文相当于一个容器,保存了 Flask 程序运行过程中的一些信息. Flask 中有两种上下文,请求上下文(request 和 session )和应用上下文(current_a ...

  4. PPT制作--这不是技巧,而是常识 然而好多人并不知道 (hsyl007转载整理)

    ​​​<hsyl007转载整理--hsyl007学习笔记收集整理 ,个人博客地址 http://hsyl007.work/zblog/> 这篇文章是我对PPT进行主题阅读的一个尝试,主题阅 ...

  5. fragment怎么获得上下文环境_Flask 源码剖析 (三):Flask 的上下文机制 (上)

    写文章其实很费力,你的「在看」很重要. 前言 在面试 Python web 方面的工作时,如果你说自己阅读过 Flask 源码,那么 Flask 上下文机制的实现原理肯定会被问到,本篇文章就来剖析一下 ...

  6. Flask 应用上下文

    上下文管理 threading.local 请求上下文:RequstContext request session 应用上下文:AppContext app(current_app) g 1.请求到来 ...

  7. [转载 整理]C语言链表实例

    C语言链表有单链表.双向链表.循环链表.单链表由数据域和指针域组成,数据域存放数据,指针域存放该数据类型的指针便于找到下一个节点.双链表则含有头指针域.数据域和尾指针域,域单链表不同,双链表可以从后一 ...

  8. [转载] 整理下java中stringBuilder和stringBuffer两个类的区别

    参考链接: Java中的StringBuffer类 StringBuilder和StringBuffer这两个类在动态拼接字符串时常用,肯定比String的效率和开销小,这是因为String的对象不会 ...

  9. [转](转载+整理)超详细的cmake教程

    cmake教程 参考 什么是cmake cmake 常见语法罗列 CMake可用变量 入门案例 单个源文件 多个源文件 同一目录,多个源文件 多个目录,多个源文件 进阶案例 自定义编译选项 指定安装和 ...

最新文章

  1. layui 数据表格内容过长遮挡_word表格技巧:遇到这三种情况,你会处理么?
  2. 【项目经理应该知道的97件事】三位一体的项目管理
  3. 信息安全系统设计基础学习总结第二周
  4. mysql 多表联查的效率_Mysql 多表联合查询效率分析
  5. 加载中...loading... 图片_搞笑图片:小子这就是你单身的原因...
  6. 协议森林01 邮差与邮局 (网络协议概观)
  7. 内核链表list.h文件剖析
  8. netty 支持多种通讯协议
  9. logstash 使用glusterfs网络存储偶发性文件解析异常的问题
  10. 万年历24节气C语言,电子万年历24节气c程序
  11. alter table add column多个字段_element中el-table单行暂无数据和整体暂无数据的默认修改...
  12. MySQL(17)-----数值函数
  13. 阿里天猫小镇的实质就是为了圈地!
  14. 2022年烟花爆竹经营单位安全管理人员培训试题及模拟考试
  15. MTK LK阶段 display框架
  16. 视频接入AI平台技术方案
  17. 基于EEG信号与面部表情的连续情绪识别
  18. java实现手机尾号评分
  19. 一个字符串截取函数c语言
  20. LPC17XX系列ISP升级流程

热门文章

  1. SDE+ORACLE优化配置
  2. Java 读取指定目录下的文件名和目录名
  3. magento 报错及解决方法
  4. Hash Table Benchmarks
  5. 观后感,读了几篇博文
  6. 在ASP.NET页面中动态添加控件
  7. Ajax,再生还是幻灭---好文推荐
  8. 会linux基本命令是脚本语言吗,如何理解Linux Shell和基本Shell脚本语言?
  9. 一个全屏页面切换实例
  10. Apache引起的wampserver安装好第二次使用无法启动问题