Flask 上下文管理-- (session,request,current_app的传递)--类似本地线程实现,以及多app应用
Flask session,request,current_app的传递
请求上下文的作用 -- 封装请求相关得数据(request,session)
  请求上下文
	request
	session
	request local类 {线程,协程的唯一ID:{stack:[RequestContext(request,session)]}} 
  应用上下文
	app local类 {线程,协程的唯一ID:{stack:[AppContext(app,g)]}} 
               # app 保存着 应用相关的值
               # g  每次请求周期都会创建一个用于在请求周期中传递值 的 容器
1 flask的 request, session 和 current_app 都是 设置方式比较新颖 -- 通过上下文管理的方式实现的
类似于本地线程 threading_local ,创建Local类
local = {
        '线程或者协程的唯一标识':{'stack':[RequestContext(),]},  # a   每个线程一份
        '线程或者协程的唯一标识':{'stack':[RequestContext(),]},  # b
        '线程或者协程的唯一标识':{'stack':[RequestContext(),]},  # c
        '线程或者协程的唯一标识':{'stack':[RequestContext(),]},  # d
        '线程或者协程的唯一标识':{'stack':[RequestContext(),]},  # e
        }
    每次请求进来app.run调用 call 方法, 将包含了所有请求相关数据的实例对象RequestContext()添加, 通过stack(键),push到一个地方Local中,使用的时候再去取(top方法取值),在请求结束后返回的时候  pop 掉
与Django的区别
请求相关数据的传递方式 :                                                
    Django
        参数一个一个传递
    Flask
        基于Local(类似于本地线程)和LocalStack(push, pop, top)完成
        参数不用来回传递, 直接获取reqeust
    多个请求一起数据也不会混淆
        单线程 - - 每次只能有一个请求处理
        多线程 - -  通过Local实现不同的数据划分 - -   thread - -线程的唯一标识
        协程 - -     greenlet - - 协程的唯一标识
flask 的上下文管理机制描述
(1)	与django相比是两种不同的方式实现:
  	django/tornado 是通过传参的方式
	flask 第通过上下文管理机制
	两种都可以实现,只是实现的方式不一样
(2)类似 threading local 机制,
     flask创建  一个local类 {线程,协程的唯一ID:{stack:[RequestContext(request,session)]}}  保证数据隔离
 		请求进来 把ReqeustContext对象 push到 对应的stack中
 		使用 的时候 通过localstack的top方法,获取local中的reqeust
 		请求终止  通过localstack pop方法,删除local的request
2 补充 partial 函数
其实就是函数调用的时候,有多个参数 参数,但是其中的一个参数已经知道了,我们可以通过这个参数重新绑定一个新的函数,然后去调用这个新函数。
from functools import partial
def f(a,b):
    return a + b
f1 = partial(f,10)
print(f1(5))
-->> 15
3 唯一标识
基于 Local类
类似于本地线程theading_local  -->> 每一个线程 创建一个
from greenlet import getcurrent as get_ident
可以基于 greenlet -->> 粒度更细
        比如 wsgi  -- 有基于线程的,也有基于协程实现的
本地线程:
    import threading
    local_values = threading.local()
    def func(num):
        local_values.name = num
        import time
        time.sleep(1)
        print(local_values.name, threading.current_thread().name)
    for i in range(20):
        th = threading.Thread(target=func, args=(i,), name='线程%s' % i)
        th.start()
4 多app应用,以及web'访问多app时的上下文
多app应用,通过前缀做分发
from werkzeug.wsgi import DispatcherMiddleware
from werkzeug.serving import run_simple
app1 = Flask('app1')
app2 = Flask('app2')
@app1.route('/index')
def index():
	return 's'
@app2.route('/index')
def index():
	return 's'
dm = DispatcherMiddleware(app1,{'/app2':app2})
if __name__ == '__main__':
	run_simple('localhost',5000,dm)
同时并发的请求 app1 和 app2,请求上下文Local类中 {
    'ID app1':{stack:[ReqeustContext,]},
    'ID app2':{stack:[ReqeustContext,]},
}
5 补充 with .. 上下文管理
class SQLHelper(object):
	def __enter__(self):
		print('开始')
		self.open()
		return self
	def open(self):
		pass
	def fetch(self):
		pass
	def close(self):
		pass
	def __exit__(self, exc_type, exc_val, exc_tb):
		print('结束')
		self.close()
with SQLHelper() as f:
	pass
6 为什么 flask的 local 保存数据要使用 列表建成的栈
#  如果是 web 程序,栈中永远是 一条数据 (可以不使用栈)
#  如果是 脚本测试 出现如下的上下文嵌套 ,会出现 多条数据
from flask import Flask,current_app,_app_ctx_stack
app1 = Flask(__name__)
app1.config['DEBUG'] = True
app2 = Flask(__name__)
app2.config['DEBUG'] = False
with app1.app_context():
    print(_app_ctx_stack._local.__storage__)
    print(current_app.config['DEBUG'])  # current_app  _app_ctx_stack.top [-1]
    with app2.app_context():
        print(_app_ctx_stack._local.__storage__)
        print(current_app.config['DEBUG'])
                #  {5116: {'stack': [<flask.ctx.AppContext object at 0x00000000038C55C0>, <flask.ctx.AppContext object at 0x00000000038C5748>]}}     False												
											Flask 上下文管理-- (session,request,current_app的传递)--类似本地线程实现,以及多app应用的更多相关文章
- Flask上下文管理、session原理和全局g对象
		
一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...
 - Flask上下文管理机制
		
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
 - Flask上下文管理
		
一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...
 - [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定
		
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
 - Flask - 上下文管理(核心)
		
参考 http://flask.pocoo.org/docs/1.0/advanced_foreword/#thread-locals-in-flask https://zhuanlan.zhihu. ...
 - Flask 上下文管理
		
为什么用threading.local? 我们都知道线程是由进程创建出来的,CPU实际执行的也是线程,那么线程其实是没有自己独有的内存空间的,所有的线程共享进程的资源和空间,共享就会有冲突,对于多线程 ...
 - Flask上下文管理及源码刨析
		
基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上 ...
 - flask 上下文管理 &源码剖析
		
基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上 ...
 - Flask上下文管理机制流程(源码剖析)
		
Flask请求上下文管理 1 偏函数 partial 使用该方式可以生成一个新函数 from functools import partial def mod( n, m ): return n % ...
 
随机推荐
- R语言操作mysql上亿数据量(ff包ffbase包和ETLUtils包)
			
平时都是几百万的数据量,这段时间公司中了个大标,有上亿的数据量. 现在情况是数据已经在数据库里面了,需要用R分析,但是完全加载不进来内存. 面对现在这种情况,R提供了ff, ffbase , ETLU ...
 - lucene实现初级搜索引擎
			
一.系统设计 搜索引擎项目代码主要分为三个部分,第一部分是构建索引,全文检索:第二部分是输入问题,对问题进行分词.提取关键词.关键词扩展:第三部分是将搜索结果输出到GUI图形用户界面. 二.搜索引擎 ...
 - python16_day11【MQ、Redis、Memcache】
			
一.RabbitMQ 是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应 ...
 - Java项目结构总结
			
一.Struts2+Spring+Hibernate 项目的文档结构 二.Spring MVC+MyBatis项目的文档结构 三.Tomcat文档目录结构 转载至:https://www.cnblog ...
 - mysql用户与权限管理笔记
			
今天想使用一下李刚那本书上的hibernate的Demo,试出了点问题,过程中就发现mysql的用户管理和权限管理上也有点东西要注意,所以顺便就写一下mysql用户管理和权限管理的笔记. 先说一说my ...
 - 20165101刘天野 2018-2019-2《网络对抗技术》Exp5 MSF基础应用
			
目录 20165101刘天野 2018-2019-2<网络对抗技术>Exp5 MSF基础应用 1. 实践内容 1.1一个主动攻击实践,如ms08_067; (1分) 1.2 一个针对浏览器 ...
 - 什么是“欧几里德范数”(Euclidean norm)?
			
x是n维向量(x1,x2,…,xn),||x||=根号(|x1|方+|x2|方+…+|xn|方) 补充:开平方,跟几何一样
 - 并发-HashMap和HashTable源码分析
			
HashMap和HashTable源码分析 参考: https://blog.csdn.net/luanlouis/article/details/41576373 http://www.cnblog ...
 - Java视频教程等百度云资源分享——更新ing
			
韩顺平javase(87讲)密码:hsp789 链接:https://pan.baidu.com/s/1eNCyvFcVHsd7P4gdvrFqtw密码:el1y 韩顺平javaee(66讲)密码:h ...
 - cn_03_r2_enterprise_sp2_x86_vl_X13_46432
			
1. 使用的 ISO为:cn_win_srv_2003_r2_enterprise_with_sp2_vl_cd1_X13-46432.iso 2.序列号 用的序列号是“DF74D-TWR86-D3F ...