【发布时间】:2019-05-21 14:13:09
【问题描述】:
所以,我正在尝试回滚数据库会话,以防发生诸如 bad_request、未授权、禁止或 not_found 之类的 HTTP 错误。
它是一个带有 wsgi 和 flask 的无服务器应用程序。
场景是:我创建了一个要保存在数据库中的条目,但是如果发生错误,我希望它回滚会话。
如果我引发异常,则会发生回滚,但如果我使用 abort(make_response(jsonify(message=message, **kwargs), 400)),则会引发 HTTPException,但 teardown_appcontext 会忽略它。
我也试过application.config['PRESERVE_CONTEXT_ON_EXCEPTION'] = True #and false too,但没有解决我的问题。
在我的应用中:
def database(application, engine=None):
sqlalchemy_url = os.environ.get('SQLALCHEMY_URL')
set_session(sqlalchemy_url, engine=engine)
@application.teardown_appcontext
def finish_session(exception=None):
commit_session(exception)
def commit_session(exception=None):
if exception:
_dbsession.rollback()
else:
_dbsession.commit()
_dbsession.remove()
if hasattr(_engine, 'dispose'):
_engine.dispose()
在这里,如果我想返回一个 bad_request 响应,则调用该函数。 abort 函数引发了一个 HTTPException,该异常被 teardown 函数忽略了
def badrequest(message='bad request.', **kwargs):
abort(make_response(jsonify(message=message, **kwargs), 400))
我希望 teardown_appcontext 也能识别 HTTPException,而不仅仅是一个异常。这样,如果调用了 abort 函数,就完成了回滚。
【问题讨论】:
标签: python flask wsgi serverless