1、Local()

作用:为每个协程或线程创建一个独立的内存空间

储存格式:

  1. {
  2. 唯一标识: {'stack': []}
  3. }

代码

  1. try:
  2. from greenlet import getcurrent as get_ident
  3. except:
  4. from threading import get_ident
  5. class Local:
  6. __slots__ = ('__storage__', '__ident_func__')
  7.  
  8. def __init__(self):
  9. # __storage__ = {1231:{'stack':[]}}
  10. object.__setattr__(self, '__storage__', {})
  11. object.__setattr__(self, '__ident_func__', get_ident)
  12.  
  13. def __getattr__(self, name):
  14. try:
  15. return self.__storage__[self.__ident_func__()][name]
  16. except KeyError:
  17. raise AttributeError(name)
  18.  
  19. def __setattr__(self, name, value):
  20. ident = self.__ident_func__()
  21. storage = self.__storage__
  22. try:
  23. storage[ident][name] = value
  24. except KeyError:
  25. storage[ident] = {name: value}
  26.  
  27. def __delattr__(self, name):
  28. try:
  29. del self.__storage__[self.__ident_func__()][name]
  30. except KeyError:
  31. raise AttributeError(name)

2、LocalStack()

作用:通过栈操作local中的列表,列表中可以储存对象

代码

  1. class LocalStack:
  2. def __init__(self):
  3. self._local = Local()
  4.  
  5. def push(self,value):
  6. rv = getattr(self._local, 'stack', None) # self._local.stack =>local.getattr
  7. if rv is None:
  8. self._local.stack = rv = [] # self._local.stack =>local.setattr
  9. rv.append(value) # self._local.stack.append(666)
  10. return rv
  11.  
  12. def pop(self):
  13. """Removes the topmost item from the stack, will return the
  14. old value or `None` if the stack was already empty.
  15. """
  16. stack = getattr(self._local, 'stack', None)
  17. if stack is None:
  18. return None
  19. elif len(stack) == 1:
  20. return stack[-1]
  21. else:
  22. return stack.pop()
  23.  
  24. def top(self):
  25. try:
  26. return self._local.stack[-1]
  27. except (AttributeError, IndexError):
  28. return None

3、上下文源码分析(request session)

  1. A wsgi->app.__call__->wsgi_app->ctx = self.request_context(environ) environ初次封装后的数据
  2. a 封装session request : request_context->RequestContext
  3. b 执行push方法->_request_ctx_stack.push(self) ctx ->_request_ctx_stack = LocalStack()->Local()

总结:

上下文管理分为:

request上下文管理

app上下文管理

  1. __call__
  2.  
  3. wsgi_app --> ctx requestcontent(request, session)
  4. -->push
  5. --> ctx LocalStack() --> Local()
  6. --> app LocalStack() --> Local()
  7. 视图函数 --> app LocalPolicy
  8. app --> 函数 --> app LockStack() --> Stack()
  9. g --> 函数 --> app LockStack() --> Stack()
  10. --> ctx LocalPolicy
  11. request --> 函数 --> LocalStack() --> Stack()
  12. session --> 函数 --> LocalStack() --> Stack()
  13. 请求结束
  14. 执行pop删除 ctx app_ctx
  15.  
  16. 1gsession的生命周期不一样
  17. session要存储在浏览器的cookie
  18. 2g和全局变量一致吗?
  19. - 全局变量项目启动加载
  20. - g会创建->销毁,全局变量不会

Flash 上下文管理的更多相关文章

  1. Flask基础(3):session、flash、特殊装饰器、蓝图、路由正则匹配、上下文管理 & flask-session

    Session: Flask 默认将 session 以加密的形式放到了浏览器的 cookie 中 Flask 的 session 就是一个字典,字典有什么方法 session 就有什么方法 flas ...

  2. python2.7高级编程 笔记一(Python中的with语句与上下文管理器学习总结)

    0.关于上下文管理器上下文管理器是可以在with语句中使用,拥有__enter__和__exit__方法的对象. with manager as var: do_something(var) 相当于以 ...

  3. 上下文管理、线程池、redis订阅和发布

    一:上下文管理: 对于一些对象在使用之后,需要关闭操作的.比如说:socket.mysql数据库连接.文件句柄等. 都可以用上下文来管理. 语法结构: Typical usage: @contextm ...

  4. 翻译《Writing Idiomatic Python》(五):类、上下文管理器、生成器

    原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...

  5. python学习笔记4(对象/引用;多范式; 上下文管理器)

    ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是储存在内存中的实体,对象名只是指向这一对象的引用(refere ...

  6. Python深入02 上下文管理器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...

  7. python 上下文管理器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...

  8. 【Python学习笔记】with语句与上下文管理器

    with语句 上下文管理器 contextlib模块 参考引用 with语句 with语句时在Python2.6中出现的新语句.在Python2.6以前,要正确的处理涉及到异常的资源管理时,需要使用t ...

  9. python with语句上下文管理的两种实现方法

    在编程中会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后,需要继续执行一些收尾动作.例如,文件读写后需要关闭,数据库读写完毕需要关闭连接,资源的加 ...

随机推荐

  1. linux版本依赖

    记住, 你的模块代码一定要为每个它要连接的内核版本重新编译 -- 至少, 在缺乏 modversions 时, 这里不涉及因为它们更多的是给内核发布制作者, 而不是开发者. 模块 是紧密结合到一个特殊 ...

  2. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(15)之前台网站页面

    源码下载地址:http://www.yealuo.com/Sccnn/Detail?KeyValue=c891ffae-7441-4afb-9a75-c5fe000e3d1c 本项目主要是一个素材的分 ...

  3. 理解Servlet

    题记:框架横行,似乎已经忘记JavaWeb最基础Servlet是如何工作的,这也是为什么要写这篇文章. Servlet是Java语言应用到Web的扩展技术,是运行在Web应用服务器上的Java程序.与 ...

  4. <QluOJ2018NewCode>计算几何(寄蒜几盒)

    题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Yes"(不含引号 ...

  5. dotnet 特性 DynamicallyInvokable 是用来做什么的

    我在 Linq 很多函数都看到 __DynamicallyInvokable 这个特性,这是一个没有官方文档的特性,也许是用来优化反射 在堆栈 网找到了以下描述 这个 __DynamicallyInv ...

  6. ES6类的继承

    ES6 引入了关键字class来定义一个类,constructor是构造方法,this代表实例对象. constructor相当于python的init 而this 则相当于self 类之间通过ext ...

  7. 基于 HTML5 + WebGL 的无人机 3D 可视化系统

    前言 近年来,无人机的发展越发迅速,既可民用于航拍,又可军用于侦察,涉及行业广泛,也被称为“会飞的照相机”.但作为军事使用,无人机的各项性能要求更加严格.重要.本系统则是通过 Hightopo 的   ...

  8. lnmp安装部署-mysql5.6+centos6.8+php7.1+nginx1.9

    1.准备工作: 1)把所有的软件安装在/Data/apps/,源码包放在/Data/tgz/,数据放在/Data/data,日志文件放在/Data/logs,项目放在/Data/webapps, mk ...

  9. 登录密码忘记修改jenkins

    find / -type f -name 'config.xml' 然后需要删除config.xml文件中的以下内容: <useSecurity>true</useSecurity& ...

  10. $Poj1037\ A\ Decorative\ Fence$ 计数类$DP$

    Poj  AcWing Description Sol 这题很数位$DP$啊, 预处理$+$试填法 $F[i][j][k]$表示用$i$块长度不同的木板,当前木板(第$i$块)在这$i$块木板中从小到 ...