为什么 flask session 对象不需要实例化?

Why doesn't flask session object need to be instantiated?

阅读文档我了解到 flask 定义了一个 class flask.session。

让我感到困惑的是,人们在使用它时并没有实例化session的对象class,而是直接使用session,如下代码:

from flask import Flask, session

app = Flask(__name__)

@app.route('/')
def index():
    session['key'] = 'value'

我不明白为什么代码不应该看起来像这样:

from flask import Flask, session

app = Flask(__name__)
s = session() # so s is an instance of the flask.session class

@app.route('/')
def index():
    s['key'] = 'value'

我也想知道这是否与文档中所说的会话作为代理有关。我读了 'Notes on Proxies' 但不太明白。

好问题。

它在烧瓶中初始化globals.py

https://github.com/pallets/flask/blob/master/flask/globals.py

session = LocalProxy(partial(_lookup_req_object, 'session'))

因此,当您从 flask 导入时,您是从其包 __init__.py 导入,这会从 globals.py 中提取会话并对其进行初始化。当您直接导入它时,您会获取对它的引用。

我应该澄清一下,会话本身不是 class。它是 LocalProxy class 的一个实例,它是请求上下文的代理。