我想在处理请求的开始时创建一个对象,并在请求的整个生命周期内保持关联。在请求的上下文中,它应该表现得像一个单例,因此每个请求获得一个而不是多个请求。
现在我想我可以将它自己附加到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
对象的属性,我也会担心冲突。有没有更好的方法呢?
答案 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()