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