我正在使用:
这是代理。
和section on proxies详细说明:
Flask提供的某些对象是其他对象的代理。 其背后的原因是这些代理之间共享 线程,它们必须分派到绑定到 必要时在后台穿线。
...
如果您需要访问 到代理的基础对象,您可以使用_get_current_object()
方法
这一切非常简单。
但是当我尝试以下操作时:
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)
则保持不变。
在上面引用的Flask documentation之后,应该相反。那为什么会这样呢?
更新
受brunns在对his answer的评论中的建议的启发,每个线程有一个基础对象
下面是一些代码,用于测试每个线程有一个基础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()
却在改变。
答案 0 :(得分:2)
session
是您从flask
模块中导入的对象。您只需导入一次,它就不会更改,它的id()
也不会更改。它在线程之间共享,并且是基础对象的代理。
每个请求都可以在不同的线程上运行,并且每个请求都有一个不同的基础对象,因此它们可能具有不同的id()
。