我想设置一个使用Flask-SQLAlchemy
构建的应用程序来回滚对数据库所做的所有更改,如果视图引发了一个异常,即在视图代码之外冒泡(即没有在内部捕获)。
即使某些对象在子事务中被刷新到数据库中,我也希望它能够自动或直接通过session.commit()
刷新。
答案 0 :(得分:18)
你可以这样做:
@app.teardown_request
def teardown_request(exception):
if exception:
db.session.rollback()
db.session.remove()
查看teardown_request信息here。如果处于调试模式,则可能需要设置PRESERVE_CONTEXT_ON_EXCEPTION
config变量。
答案 1 :(得分:1)
您可以将回滚包括在自定义错误处理程序中...
@app.errorhandler(500)
def internal_error(error):
db.session.rollback()
return render_template('500.html'), 500
请参阅“自定义错误页面”部分下的here。