我有一个python模块UserManager,负责管理与用户管理相关的所有事情 - 用户,组,权限,身份验证。通过在构造函数中传递SQLAlchemy引擎参数的主类提供对这些资产的访问。需要引擎来制作表类映射(使用映射器对象),并发出会话。
这是在app模块中建立gobal变量的方式:
class UserManager:
def __init__(self, db):
self.db = db
self._db_session = None
meta = MetaData(db)
user_table = Table(
'USR_User', meta,
Column('field1'),
Column('field3')
)
mapper(User, user_table)
@property
def db_session(self):
if self._db_session is None:
self._db_session = scoped_session(sessionmaker())
self._db_session.configure(bind=self.db)
return self._db_session
class User(object):
def init(self, um):
self.um = um
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
um = UserManager(db.engine)
这样的模块旨在按目的与上下文无关,因此它既可以用于本地运行,也可以用于Web应用程序。
但是这里出现了问题:我不时会遇到可怕的问题而无法重新连接,直到无效的交易回滚为止#34;错误,可能是由UserManager代码中的某些失败事务引起的。
我现在正在尝试确定问题来源。也许在Web服务器的动态上下文中如何处理数据库是不正确的?也许我必须将db.session传递给um对象,以便我可以确定数据库连接没有混淆?
答案 0 :(得分:0)
在Web上下文中,您应该考虑隔离每个用户的请求。为此,您必须使用flask.g
仅从一个函数共享对一个请求有效的数据 另一个,全局变量不够好,因为它会破坏 在线程环境 .Flask为您提供了一个特殊对象 确保它仅对活动请求有效 为每个请求返回不同的值。简而言之:它确实如此 正确的事情,就像请求和会话一样。
您可以详细了解here。