我想知道是否有一种优雅的方法可以在代码中引发Exception,但是不回退金字塔python Web应用程序中的整个会话。
用例: 输入错误的登录凭据后,我想在User表上增加一些计数器。在计数器超过V值n次之后,我想提出一个例外,该帐户被阻止,无法执行进一步的操作。不幸的是,引发异常回滚整个会话,计数器未正确增加。
答案 0 :(得分:3)
我不会碰这些,我宁愿创建一个新会话,进行更新,并提交这个新会话,然后让异常通过。
创建新会话:这在很大程度上取决于项目的组织方式。例如,我有:
config.registry['dbsession_factory']
然后在请求中可以访问
request.registry['dbsession_factory'].
您将可以找到类似project/models/__init__.py
的内容。然后您可以按以下方式使用它:
db = request.registry['dbsession_factory']()
try:
db.query(...whatever.i.need...)
except:
db.rollback()
finally:
db.commit()