我在用:
章节关于session http://flask.pocoo.org/docs/0.12/api/#flask.sessionFlask 文档说:
这是一个代理。
and 关于代理的部分 http://flask.pocoo.org/docs/0.12/reqcontext/#notes-on-proxies详细说明:
Flask 提供的一些对象是其他对象的代理。
这背后的原因是这些代理在之间共享
线程,它们必须分派到绑定到的实际对象
必要时在幕后线程。
...
如果您需要访问
对于被代理的底层对象,您可以使用_get_current_object() https://werkzeug.palletsprojects.com/en/0.15.x/local/#werkzeug.local.LocalProxy._get_current_object method
这一切都非常简单。
但是当我尝试以下操作时:
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('________________________________')
return 'Check the console! ;-)'
每次我提出请求时/
- 的价值id(session._get_current_object())
是不同的,而id(session)
保持不变。
下列的烧瓶文档 http://flask.pocoo.org/docs/0.12/,上面引用的,应该是相反的。那么为什么会发生这种情况呢?
UPDATE
受到启发brunns https://stackoverflow.com/users/1073696/brunns评论中的建议他的回答 https://stackoverflow.com/a/55758011/8554766,每个线程有一个底层对象
这是一些代码,用于测试存在一个底层的假设session
目的 (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! ;-)'
尽管满怀期待,threading.current_thread().ident)
从未改变,而id(session._get_current_object()
在改变。