【发布时间】:2019-09-09 11:50:46
【问题描述】:
我正在使用:
- Python 3.6.1
- 烧瓶 0.12.2
Flask 文档的Section on session 说:
这是一个代理。
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 在 cmets 中对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() 正在改变。
【问题讨论】:
标签: python python-3.x session flask request