Flask中有两种上下文,请求上下文和应用上下文。

请求上下文(request context)

request和session都属于请求上下文对象。

request:封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。

session:用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息。

应用上下文(application context)

current_app和g都属于应用上下文对象。

current_app:表示当前运行程序文件的程序实例。

g:处理请求时,用于临时存储的对象,每次请求都会重设这个变量。比如:我们可以获取一些临时请求的用户信息。

  • 当调用app = Flask(_name_)的时候,创建了程序应用对象app;
  • request 在每次http请求发生时,WSGI server调用Flask.call();然后在Flask内部创建的request对象;
  • app的生命周期大于request和g,一个app存活期间,可能发生多次http请求,所以就会有多个request和g。
  • 最终传入视图函数,通过return、redirect或render_template生成response对象,返回给客户端。

区别: 请求上下文:保存了客户端和服务器交互的数据。 应用上下文:在flask程序运行过程中,保存的一些配置信息,比如程序文件名、数据库的连接、用户信息等。

上下文对象的作用域

在flask项目中某一个功能中会有多个视图,那么from flask import request,current_app,session,g,怎么保证某次请求的上下文不会被别的视图拿走呢?

从pycharm中进入globals.py:

_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()
current_app = LocalProxy(_find_app)
request = LocalProxy(partial(_lookup_req_object, 'request'))
session = LocalProxy(partial(_lookup_req_object, 'session'))
g = LocalProxy(partial(_lookup_app_object, 'g'))

线程有个叫做ThreadLocal的类,也就是通常实现线程隔离的类。而werkzeug自己实现了它的线程隔离类:werkzeug.local.Local。LocalStack就是用Local实现的。

LocalStack是flask定义的线程隔离的栈存储对象,分别用来保存应用和请求上下文。
它是线程隔离的意思就是说,对于不同的线程,它们访问这两个对象看到的结果是不一样的、完全隔离的。这是根据pid的不同实现的,类似于门牌号。
而每个传给flask对象的请求,都是在不同的线程中处理,而且同一时刻每个线程只处理一个请求。所以对于每个请求来说,它们完全不用担心自己上下文中的数据被别的请求所修改。

而这个LocalProxy 的作用就是可以根据线程/协程返回对应当前协程/线程的对象,也就是说

  • 线程 A 往 LocalProxy 中塞入 A

  • 线程 B 往 LocalProxy 中塞入 B

无论在是什么地方,

  • 线程 A 永远取到得是 A,线程 B 取到得永远是 B

此处引入:

flask中current_app._get_current_object()与current_app有什么区别

https://segmentfault.com/q/1010000005865632/a-1020000005865704

查看LocalStack源码:
def __init__(self):self._local = Local()def __release_local__(self):self._local.__release_local__()def _get__ident_func__(self):return self._local.__ident_func__def _set__ident_func__(self, value):object.__setattr__(self._local, '__ident_func__', value)__ident_func__ = property(_get__ident_func__, _set__ident_func__)del _get__ident_func__, _set__ident_func__def __call__(self):def _lookup():rv = self.topif rv is None:raise RuntimeError('object unbound')return rvreturn LocalProxy(_lookup)

当 app = Flask(__name__) 构造出一个 Flask App 时,App Context 并不会被自动推入 Stack 中。所以此时 Local Stack 的栈顶是空的,current_app 也是 unbound 状态。

这就说明了为什么上下文需要激活状态,

那么为什么在应用运行时不需要手动 app_context().push() 呢?

因为 Flask App 在作为 WSGI Application 运行时,会在每个请求进入的时候将请求上下文推入。

Flask中current_app和g对象相关推荐

  1. Flask学习笔记之g对象

    ### 保存全局变量的g属性: g:global 1. g对象是专门用来保存用户的数据的. 2. g对象在一次请求中的所有的代码的地方,都是可以使用的.

  2. python web开发-flask中response,cookies,session对象使用详解

    Response响应对象: 当一个web请求被服务器处理完后,会返回用户请求的响应,这时候就要用到响应对象,根据响应给用户的形式不同,响应对象有以下几种处理方式 如果返回的是一个合法的响应对象,它会从 ...

  3. Flask中的上下文

    1. 分为请求上下文和应用上下文 应用上下文和请求上下文都是存放到一个LocalStack的栈中 应用app相关的操作就必须要用到应用上下文 请求相关的操作就必须用到请求上下文 2.请求上下文中还包括 ...

  4. 【Flask】在g对象中存放List,实现在捕获异常后继续执行for循环

    目的 在捕获异常后,本层先不处理,但希望能够继续执行for循环,所以也不能继续抛出新的异常 于是使用flask提供的'g'对象,存储所有的异常内容(可以经过自定义数据格式封装,本例使用List存放发生 ...

  5. flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识...

    flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识 flask中的CBV写法 后端代码 # 导入vie ...

  6. Flask框架(flask中的请求上下文和应用上下文,以及请求钩子的使用,Flask-Script 扩展命令行)

    1.请求上下文与应用上下文 请求上下文(request context) request和session都属于请求上下文对象. 应用上下文(application context) current_a ...

  7. flask中的信号机制

    2019独角兽企业重金招聘Python工程师标准>>> flask中信号机制 Flask信号允许特定的发送端通知订阅者发生了什么.既然知道发生了什么,那我们可以知道接下来该做什么了. ...

  8. Flask中的请求上下文和应用上下文

    在Flask中处理请求时,应用会生成一个"请求上下文"对象.整个请求的处理过程,都会在这个上下文对象中进行.这保证了请求的处理过程不被干扰.处理请求的具体代码如下: def wsg ...

  9. Flask 中的上下文管理和请求钩子

    Flask 中的上下文管理和请求钩子 在使用 Flask 框架实现功能接口的时候,前端点击按钮发送请求的请求方式和 form 表单提交给后端的数据,后端都是通过 Flask 中的 request 对象 ...

最新文章

  1. 在VMWare上安装linux
  2. windows server 网络负载均衡配置
  3. 括号生成Python解法
  4. [Leetcode][第116 117题][JAVA][填充每个节点的下一个右侧节点指针][BFS][链表前驱节点]
  5. crossdomain.xml
  6. php文件管理 打包,Thinkphp6如何利用ZipArchive打包下载文件
  7. python-自定义模块-文件的操作
  8. rust笔记8 collections基础
  9. zynq文档学习之向GPIO引脚写数据
  10. Eclipse 4.7(Oxygen)安装Tomcat Plugin 后没有小猫图标解决方法
  11. 如何完卸载oracle12c,卸载Oracle12c方法
  12. 安装MySQL5.5.28步骤
  13. 聊聊最近的几件小事儿
  14. 20年前的网文:我彷徨在唯物主义和唯心主义之间
  15. iphone3GS iOS6.0.1不完美越狱详细图文教程
  16. maya python 游戏与影视编程指南pdf_Maya Python 游戏与影视编程指南
  17. 贤鱼的刷题日常(数据结构栈学习)--P1175 表达式的转换--题目详解
  18. TCP编程服务器与客户端对话
  19. 阿里云的服务器,网站域名没有备案时为什么不可以访问?
  20. Easypoi Excel导出和word导出带图片(图片不显示问题必须用字节)

热门文章

  1. 地图插件-百度地图使用教程
  2. Android极光推送厂商离线通道集成文档及flutter集成总结
  3. Java核心技术卷一 -第五章:类的强制类型转换与instanceof操作符
  4. JavaWeb——JSP实现书城首页
  5. 【Halcon】基于形状的模板匹配的定位.md
  6. 数据包络java_外文翻译—模糊数据包络分析(DEA)模型和排序方法
  7. ffmpeg 编解码 码率设置问题 CBR 、VBR
  8. 海量数据及多云环境下,数据库运维、分布式转型、国产化改造实践丨DAMS峰会
  9. 物联网设备的分类及未来发展中存在的问题有哪些?
  10. 直接在电脑上使用安卓系统