在 Flask 中的请求的整个生命周期内保留一个对象

Keeping an object over the lifetime of a request in Flask

我想在处理请求的开始时创建一个对象,并在请求的整个生命周期内保持关联。在请求的上下文中,它应该表现得像一个单例,因此每个请求都会得到一个,但不会超过一个。

现在我想我可以让它在它的 __new__ 方法中附加到 request 变量,这可行,但我不确定是否有更好的方法这样做比弄乱 request 变量好吗?

class AuthScheme(object):
    context_attribute = 'auth_scheme'

    # inside the context of a request behave like a singleton
    def __new__(cls, request, *args, **kwargs):
        if not hasattr(request, cls.context_attribute):
            # instantiante via base class only if there is no instance
            # for this request yet
            instance = super(AuthScheme, cls).__new__(
                cls, request, *args, **kwargs)
            setattr(request, cls.context_attribute, instance)

        # return instance from request context
        return getattr(request, cls.context_attribute)

我还担心如果其他东西试图创建具有相同名称的 request 对象的 属性 时会发生冲突。有更好的方法吗?

g 就是您要找的。

from flask import g

您可以添加任何您想要的属性 g。它是为每个请求重新创建的。 One common use is for storing a reference to the database

@app.before_request
def before_request():
    g.db = connect_db()

@app.teardown_request
def teardown_request(exception):
    db = getattr(g, 'db', None)
    if db is not None:
        db.close()