Итак, я пытаюсь откатить сеанс базы данных в случае возникновения ошибки HTTP, такой как bad_request, неавторизованный, запрещенный или not_found.
это приложение без сервера с 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.Функция прерывания вызывает HTTPException, который игнорируется функцией teardown
def badrequest(message='bad request.', **kwargs):
abort(make_response(jsonify(message=message, **kwargs), 400))
Я хочу, чтобы teardown_appcontext также распознавал HTTPException, а не только Exception.Таким образом, если вызывается функция прерывания, откат будет выполнен.