Flask 上下文管理-- (session,request,current_app的传递)--类似本地线程实现,以及多app应用...
Flask session,request,current_app的传递
请求上下文的作用 -- 封装请求相关得数据(request,session)
请求上下文requestsessionrequest 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 partialdef f(a,b):return a + bf1 = partial(f,10)print(f1(5))
-->> 15
3 唯一标识
基于 Local类类似于本地线程theading_local -->> 每一个线程 创建一个from greenlet import getcurrent as get_ident
可以基于 greenlet -->> 粒度更细比如 wsgi -- 有基于线程的,也有基于协程实现的本地线程:import threadinglocal_values = threading.local()def func(num):local_values.name = numimport timetime.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_simpleapp1 = 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 selfdef open(self):passdef fetch(self):passdef close(self):passdef __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_stackapp1 = Flask(__name__)
app1.config['DEBUG'] = Trueapp2 = Flask(__name__)
app2.config['DEBUG'] = Falsewith 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
转载于:https://www.cnblogs.com/big-handsome-guy/p/8545154.html
Flask 上下文管理-- (session,request,current_app的传递)--类似本地线程实现,以及多app应用...相关推荐
- flask 上下文管理
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定...
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- flask上下文管理机制
flask中的上下文分为请求上写文和应用上下文,接下来,从以下三个大的方面分别探讨flask的两大上下文管理机制. 方面一:请求进来时 方面二:视图函数 方面三:请求结束前 先来一个最简单的flask ...
- flask总结之session,websocket,上下文管理
1.关于session flask是带有session的,它加密后存储在用户浏览器的cookie中,可以通过app.seesion_interface源码查看 from flask import Fl ...
- Flask的上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- hibernate 管理 Session(单独使用session,非spring)
hibernate 管理 Session(单独使用session,非spring) Hibernate 自身提供了三种管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 S ...
- hibernate java内存一次能取多少条_Hibernate管理Session和批量操作分析
本文详细分析了Hibernate管理Session和批量操作的用法.分享给大家供大家参考.具体分析如下: Hibernate管理Session Hibernate自身提供了三种管理Session对象的 ...
- python Flask 10 Flask请求上下文管理werkzeug
什么是上下文 上下文相当于一个容器,保存了 Flask 程序运行过程中的一些信息. Flask 中有两种上下文,请求上下文(request 和 session )和应用上下文(current_a ...
- Python 21 Flask(二)上下文管理详解
上下文管理 对于上下文管理我没有找到明确的定义,但是经过源码流程的学习后,我觉得所谓的上下文管理应该就是Flask对请求和应用相关数据的一种处理方式,它不是像Django一样通过参数的传导,而是创建了 ...
最新文章
- 给iOS开发者的React Native入门使用教程
- Java线程有哪些不太为人所知的技巧与用法?
- java读取大txt文件_使用java读取txt里边的文件内容并获取大小(M).txt
- urlencode python_python爬虫之url中的中文问题
- 合泰单片机数码管c语言,合泰单片机定时器数码管显示
- java 日期函数转换_java 日期函数转换
- java heroku_Heroku和Java –从新手到初学者,第2部分
- 平庸技术流,用 WebApi +AngularJS 实现网络爬虫
- C++:MAC安装Boost库文件并且使用CLion开发
- linux用xshell编辑文件,Linux远程管理器xshell和xftp使用教程
- 张家口市12320卫生热线呼叫中心预计今年初启动
- arcgis api for js入门开发系列六地图分屏对比(含源代码)
- 1207.1——C语言 函数
- Mac 开发 Hue
- MYSQL正在使用select发现现场记录方法,包括一个逗号分隔的字符串
- 计算机解码原理图,diy制作改进的CS4398解码 DAC PCB和原理图纸
- linux dsdt屏蔽显卡,关于DSDT屏蔽独显的一点认识和方法
- 为什么你还没有买新能源汽车?
- 门控时钟电路(Intergrated clock gating)
- 【python】数组内某数加一如何实现?
热门文章
- latex 数学公式
- 腾讯数据库专家多年运维经验凝聚成简,总结这份595页工作笔记
- 2020年中国网络安全市场全景图
- Redis学习总结(15)——Redis 基本数据类型使用场景
- Spring Cloud与微服务学习总结(5)——认证鉴权与API权限控制在微服务架构中的设计与实现(三)
- App后台开发运维和架构实践学习总结(3)——RestFul架构下API接口设计注意点
- PHP学习总结(4)——PHP入门篇之PHP计算表达式
- Mysql学习总结(19)——Mysql无法创建外键的原因
- 台式计算机一般多大功率,台式电脑功率一般多大 台式机功率有多少【详细介绍】...
- thrift的lua实现