【问题标题】:SQLAlchemy scoped_session: Best approach of getting it to viewsSQLAlchemy scoped_session:获取视图的最佳方法
【发布时间】:2013-08-27 23:18:40
【问题描述】:

我正在使用 WebApp2、SQLAlchemy、Apache、PostgrSQL 等创建 Web 应用程序。我有一个 config 文件,它存储数据库凭据并使用 scoped_session 创建会话对象。现在我所有的视图文件都导入这个配置文件并像这样使用会话对象:

some_view.py
import config

def view():
   query = config.session.query(bla bla)

这种方法不是最后一种,我想使用最好的方法。

我想在这里实现的是使用 decorator 或 webapp2 相关的内置方法获取会话对象的某种方式,以便在执行视图函数后会话对象已经关闭。我尝试了很多方法,但无法实现。一个工作的 sn-p 将受到高度赞赏。

如果有人有更好的方法,请提出建议。

谢谢

编辑-----

@javex:感谢您的建议。我正在寻找一个装饰器类,它在调用时将返回一个 scoped_session 对象,当工作完成时,关闭会话。这里有一个示例代码供您参考,但它不起作用。

class GetDBSession(object):
    """Decorator class to create DB session object"""
    def __init__(self):
        self.session = scoped_session(sessionmaker(bind=database_engine))

    def __exit__(self): #Dont know if it works
        self.session.close()

    def __call__(self): #Dont know if it works
        return self.session

我想这样使用它:

@GetDBSession()
def view_func():
    #work with session object here

【问题讨论】:

    标签: python session sqlalchemy decorator webapp2


    【解决方案1】:

    我对 WebApp2 了解不多,但据我所知,您想要在请求处理结束时提交并在出现异常时回滚的东西。您可以采用一些解决方案。

    首先,我建议你阅读When do I construct a Session, when do I commit it, and when do I close it?。它有一段关于框架集成的两个扩展特别有用:

    这些将 SQLAlchemy 分别集成到 zope 事务和烧瓶框架中。毕竟,您想要的是围绕请求处理构建一些东西:

    try:
        result = handle_request(request)
        config.session.commit()
    except:
        config.session.rollback()
        raise
    

    只有在没有异常的情况下才会提交,否则它将回滚并传递异常。如何集成它取决于 WebApp2 以及它如何允许这种集成。许多框架提供了某种“之前处理之后”的方法,就像上面一样:你得到一个处理请求的回调,你可以在它之前做一些事情,然后调用回调,然后在它之后做一些事情。这允许使用这种简洁的 try/except 包装器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多