python - session._get_current_object() 究竟返回了什么对象?
问题描述
我正在玩 Flask,努力了解会话如何工作的细节,我正在使用:
- Python 3.6.1
- 烧瓶 0.12.2
Flask 文档清楚地说明(粗体是我的):
session 对象的工作方式与普通的 dict 非常相似,不同之处在于它跟踪修改。
这是一个代理。
...
关于代理的部分提到(再次,粗体是我的):
如果您需要访问被代理的底层对象,您可以使用该
_get_current_object()
方法
因此,对于请求,底层对象 ( session._get_current_object()
) 必须保持不变,或者,正如这个答案和评论所建议的,一个线程。但是,它不会持续存在,也不会在请求内部,也不会线程。
这是一个演示代码:
import threading
from flask import (
Flask,
session,
)
app = Flask(__name__)
app.secret_key = 'some random secret key'
@app.route('/')
def index():
print("session ID is: {}".format(id(session)))
print("session._get_current_object() ID is: {}".format(id(session._get_current_object())))
print("threading.current_thread().ident is: {}".format(threading.current_thread().ident))
print('________________________________')
return 'Check the console! ;-)'
如果你将运行上面的 Flask 应用程序,并且反复转到will/
返回的session._get_current_object()
--id,偶尔会更改,而threading.current_thread().ident
从不更改。
这导致我提出以下问题:
- 究竟返回的是什么
session._get_current_object()
? - 我知道它是一个对象底层
session
代理,但是这个底层对象绑定到什么(如果它不是请求而不是线程,如果有什么我希望它永远不会改变,对于上面的简单应用程序)?
解决方案
究竟返回的是
session._get_current_object()
什么?
从技术上讲,它是在名为 的实例session
中最顶层元素的属性中引用的对象。
该堆栈的最顶层元素是在中实例化的a,每个 HTTP 请求都会调用它。与本地堆栈之间的实现方法及其自身。该方法还负责为上下文请求新会话。LocalStack
_request_ctx_stack
RequestContext
Flask.wsgi_app
RequestContext
push
pop
_request_ctx_stack
push
这个会话是在session
代理中可用的;RequestContext
已初始化的请求可通过request
代理获得。这两个代理只能在请求上下文中使用,即处理活动的 HTTP 请求。
我知道它是一个对象底层会话代理,但是这个底层对象绑定到什么(如果它不是请求而不是线程,如果有什么我希望它永远不会改变,对于上面的简单应用程序)?
如上所述,由session
本地代理代理的请求上下文会话属于RequestContext
. 它随着每个请求而变化。如上下文生命周期中所述,为每个请求创建一个新上下文,并且每次push
执行时都会创建一个新会话。
在连续请求之间保持相同的 idsession._get_current_object()
可能是由于新会话对象创建在与前一个请求中的旧会话对象所占用的内存地址相同的内存地址中。
另请参阅: Flask 文档的上下文如何工作部分。
推荐阅读
- azure - 如何在 Azure AD B2C 租户中注册 Zendesk 应用程序(基于 SAML)以执行 SSO?
- python - 收到“从事件循环自管道读取错误”错误
- python - 发布python包包含子目录
- r - 由于可能的索引错误,时间序列函数不起作用?
- design-patterns - 寻找“为问题找到设计模式”的问题
- ios - mapKit 是否有任何默认按钮允许用户将地图的方向从设备方向更改为北上?
- php - PHP 通过使用一个数组键作为键,另一个作为其值来创建一个数组
- angular - 如何将网格的 id 值传递给按钮?
- java - 尝试从文件中读取文本时出错
- python - 最小的缺失数字