将非线程SQLAlchemy代码与Flask-SQLAlchemy集成

时间:2014-11-27 07:56:44

标签: python flask sqlalchemy flask-sqlalchemy

我有一个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对象,以便我可以确定数据库连接没有混淆?

1 个答案:

答案 0 :(得分:0)

在Web上下文中,您应该考虑隔离每个用户的请求。为此,您必须使用flask.g

  

仅从一个函数共享对一个请求有效的数据   另一个,全局变量不够好,因为它会破坏   在线程环境 .Flask为您提供了一个特殊对象   确保它仅对活动请求有效   为每个请求返回不同的值。简而言之:它确实如此   正确的事情,就像请求和会话一样。

您可以详细了解here