在 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()
我想在处理请求的开始时创建一个对象,并在请求的整个生命周期内保持关联。在请求的上下文中,它应该表现得像一个单例,因此每个请求都会得到一个,但不会超过一个。
现在我想我可以让它在它的 __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()