1

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

some_view.py
import config

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

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

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

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

谢谢

编辑 - - -

@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
4

1 回答 1

0

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

首先,我建议你阅读我什么时候构造一个 Session,我什么时候提交它,我什么时候关闭它?. 它有一段关于框架集成的两个扩展特别有用:

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

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

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

于 2013-08-25T11:58:31.990 回答