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

时间:2015-01-15 06:22:01

标签: python flask

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

现在我想我可以将它自己附加到request方法的__new__变量中,这可行,但我不确定是否有没有比把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对象的属性,我也会担心冲突。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:2)

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()