Python 在Flask中请求的生存期内保留对象

Python 在Flask中请求的生存期内保留对象,python,flask,Python,Flask,我想在处理请求开始时创建一个对象,并在请求的整个生命周期中保持它的关联。在一个请求的上下文中,它的行为应该像一个单例,因此每个请求得到一个而不是多个单例 现在我想我可以让它在它的\uuuuu new\uuuuuu方法中将自己附加到请求变量上,这会起作用,但我不确定是否有比把请求变量弄得乱七八糟更好的方法 class AuthScheme(object): context_attribute = 'auth_scheme' # inside the context of a re

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

现在我想我可以让它在它的
\uuuuu new\uuuuuu
方法中将自己附加到
请求
变量上,这会起作用,但我不确定是否有比把
请求
变量弄得乱七八糟更好的方法

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
对象的属性,会发生冲突。有更好的方法吗?

就是你想要的

from flask import g
您可以添加想要添加的任何属性
g
。它将为每个请求重新创建


为什么不使用会话?@BurhanKhalid感谢您的提示,但据我所知,会话用于跨多个请求保存值,不是吗?我只想在单个请求期间保留此对象。您说的是“请求的整个生命周期”,当页面提供给浏览器时,请求即告完成。你确定你找对地方了吗?你想解决什么问题吗?@dirn谢谢,我不知道这个问题,这似乎就是我要找的!如果你写一个答案,我会记为correct@BurhanKhalid问题是我需要在请求处理的开始创建这个对象。稍后,我需要在请求后在
decorator中再次检索它。
@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()