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应用...相关推荐

  1. flask 上下文管理

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

  2. [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定...

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. flask上下文管理机制

    flask中的上下文分为请求上写文和应用上下文,接下来,从以下三个大的方面分别探讨flask的两大上下文管理机制. 方面一:请求进来时 方面二:视图函数 方面三:请求结束前 先来一个最简单的flask ...

  4. flask总结之session,websocket,上下文管理

    1.关于session flask是带有session的,它加密后存储在用户浏览器的cookie中,可以通过app.seesion_interface源码查看 from flask import Fl ...

  5. Flask的上下文管理机制

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

  6. hibernate 管理 Session(单独使用session,非spring)

    hibernate 管理 Session(单独使用session,非spring) Hibernate 自身提供了三种管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 S ...

  7. hibernate java内存一次能取多少条_Hibernate管理Session和批量操作分析

    本文详细分析了Hibernate管理Session和批量操作的用法.分享给大家供大家参考.具体分析如下: Hibernate管理Session Hibernate自身提供了三种管理Session对象的 ...

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

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

  9. Python 21 Flask(二)上下文管理详解

    上下文管理 对于上下文管理我没有找到明确的定义,但是经过源码流程的学习后,我觉得所谓的上下文管理应该就是Flask对请求和应用相关数据的一种处理方式,它不是像Django一样通过参数的传导,而是创建了 ...

最新文章

  1. 给iOS开发者的React Native入门使用教程
  2. Java线程有哪些不太为人所知的技巧与用法?
  3. java读取大txt文件_使用java读取txt里边的文件内容并获取大小(M).txt
  4. urlencode python_python爬虫之url中的中文问题
  5. 合泰单片机数码管c语言,合泰单片机定时器数码管显示
  6. java 日期函数转换_java 日期函数转换
  7. java heroku_Heroku和Java –从新手到初学者,第2部分
  8. 平庸技术流,用 WebApi +AngularJS 实现网络爬虫
  9. C++:MAC安装Boost库文件并且使用CLion开发
  10. linux用xshell编辑文件,Linux远程管理器xshell和xftp使用教程
  11. 张家口市12320卫生热线呼叫中心预计今年初启动
  12. arcgis api for js入门开发系列六地图分屏对比(含源代码)
  13. 1207.1——C语言 函数
  14. Mac 开发 Hue
  15. MYSQL正在使用select发现现场记录方法,包括一个逗号分隔的字符串
  16. 计算机解码原理图,diy制作改进的CS4398解码 DAC PCB和原理图纸
  17. linux dsdt屏蔽显卡,关于DSDT屏蔽独显的一点认识和方法
  18. 为什么你还没有买新能源汽车?
  19. 门控时钟电路(Intergrated clock gating)
  20. 【python】数组内某数加一如何实现?

热门文章

  1. latex 数学公式
  2. 腾讯数据库专家多年运维经验凝聚成简,总结这份595页工作笔记
  3. 2020年中国网络安全市场全景图
  4. Redis学习总结(15)——Redis 基本数据类型使用场景
  5. Spring Cloud与微服务学习总结(5)——认证鉴权与API权限控制在微服务架构中的设计与实现(三)
  6. App后台开发运维和架构实践学习总结(3)——RestFul架构下API接口设计注意点
  7. PHP学习总结(4)——PHP入门篇之PHP计算表达式
  8. Mysql学习总结(19)——Mysql无法创建外键的原因
  9. 台式计算机一般多大功率,台式电脑功率一般多大 台式机功率有多少【详细介绍】...
  10. thrift的lua实现