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应用的更多相关文章

  1. Flask上下文管理、session原理和全局g对象

    一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...

  2. Flask上下文管理机制

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

  3. Flask上下文管理

    一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...

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

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

  5. Flask - 上下文管理(核心)

    参考 http://flask.pocoo.org/docs/1.0/advanced_foreword/#thread-locals-in-flask https://zhuanlan.zhihu. ...

  6. Flask 上下文管理

    为什么用threading.local? 我们都知道线程是由进程创建出来的,CPU实际执行的也是线程,那么线程其实是没有自己独有的内存空间的,所有的线程共享进程的资源和空间,共享就会有冲突,对于多线程 ...

  7. Flask上下文管理及源码刨析

    基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上 ...

  8. flask 上下文管理 &源码剖析

    基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上 ...

  9. Flask上下文管理机制流程(源码剖析)

    Flask请求上下文管理 1 偏函数 partial 使用该方式可以生成一个新函数 from functools import partial def mod( n, m ): return n % ...

随机推荐

  1. sublime txet 3 python 开发环境安装配置

    下载python 下载地址:https://www.python.org/downloads/windows/ 下载sublime text 3 下载地址:https://www.sublimetex ...

  2. jQuery Mobile 手动显示ajax加载器

    在jquery mobile开发中,经常需要调用ajax方法,异步获取数据,如果异步获取数据方法由于网速等等的原因,会有一个反应时间,如果能在点击按钮后数据处理期间,给一个正在加载的提示,客户体验会更 ...

  3. Spring 知识点总结

    一.Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Sprin ...

  4. how can i get the source code path && file names from an ELF file(compired with -g)?

    https://stackoverflow.com/questions/31333337/how-can-i-get-the-source-code-path-file-names-from-an-e ...

  5. HBase在数据统计应用中的使用心得

    转载自:http://www.cnblogs.com/panfeng412/archive/2011/11/19/2254921.html 1. 数据统计的需求 互联网上对于数据的统计,一个重要的应用 ...

  6. Android 电池关机充电

    android 电池(一):锂电池基本原理篇 android 电池(二):android关机充电流程.充电画面显示 android 电池(三):android电池系统 android电池(四):电池 ...

  7. ios 中实现storyboard 与xib 之间的切换

    1,跳转到xib 假设有一个按钮,这个按钮就是实现跳转的,那么在这个按钮的点击事件中,代码可以这样写. AViewController *a1= [[AViewController alloc]ini ...

  8. jQuery垂直缩略图相册插件 支持鼠标滑动翻页

    在线演示 本地下载

  9. D3学习之动画和变换

    D3学习之动画和变换 ##(17.02.27-02.28) 主要学习到了D3对动画和缓动函数的一些应用,结合前面的选择器.监听事件.自定义插值器等,拓展了动画的效果和样式. 主要内容 单元素动画 多元 ...

  10. Oracle 数据库比较日期大小

    在今天或者今天之前作比较:select * from JN_BUS_KJLWSBJBXX where dqsj < to_date('2007-09-07 00:00:00','yyyy-mm- ...