【发布时间】:2019-04-23 07:11:30
【问题描述】:
我正在玩 Flask,努力了解会话如何工作的细节,我正在使用:
- Python 3.6.1
- 烧瓶 0.12.2
Flask 文档clearly states(粗体字是我的):
会话对象的工作方式与普通的字典非常相似,带有 区别在于它会跟踪修改。
这是一个代理。
...
Section on proxies 提到(再次,粗体是我的):
如果您需要访问 对于被代理的底层对象,您可以使用
_get_current_object()方法
因此,对于请求,底层对象 (session._get_current_object()) 必须保持不变,或者正如 this answer and comment 所建议的那样,一个线程。但是,它不会持续存在,也不会在请求内部,也不会在线程中。
这是一个演示代码:
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 应用程序,并反复访问 / — session._get_current_object() 返回的 id 偶尔会改变,而 threading.current_thread().ident 永远不会改变。
这导致我提出以下问题:
-
session._get_current_object()返回的究竟是什么? - 我知道它是
session代理的底层对象,但这个底层对象绑定到什么(如果它不是请求而不是线程,如果有的话,我希望它永远不会改变,对于简单的应用程序以上)?
【问题讨论】:
-
在this answer (to another question)中给出了很好的解释。