Ответ 1
errorhandler
также может принимать тип исключения:
@app.errorhandler(AssertionError)
def handle_sqlalchemy_assertion_error(err):
return make_response(standard_response(None, 400, err.message), 400)
В настоящее время я пишу REST API для приложения, над которым я работаю. Приложение написано на python, используя флягу. У меня есть следующее:
try:
_profile = profile(
name=request.json['name'],
password=profile.get_salted_password('blablabla'),
email=request.json['email'],
created_by=1,
last_updated_by=1
)
except AssertionError:
abort(400)
session = DatabaseEngine.getSession()
session.add(_profile)
try:
session.commit()
except IntegrityError:
abort(400)
Обработчик ошибок выглядит следующим образом:
@app.errorhandler(400)
def not_found(error):
return make_response(standard_response(None, 400, 'Bad request'), 400)
Я использую ошибку 400, чтобы обозначить как проблему с валидатором модели sqlalchemy и уникальным ограничением при записи в базу данных, и в обоих случаях клиенту посылается следующая ошибка:
{
"data": null,
"error": {
"msg": "Bad request",
"no": 400
},
"success": false
}
Есть ли способ по-прежнему использовать abort (400), но так или иначе установить ошибку, чтобы обработчик ошибок мог позаботиться о добавлении дополнительной информации для объекта ошибки в результате?
Я хотел бы, чтобы это соответствовало:
{
"data": null,
"error": {
"msg": "(IntegrityError) duplicate key value violates unique constraint profile_email_key",
"no": 400
},
"success": false
}
errorhandler
также может принимать тип исключения:
@app.errorhandler(AssertionError)
def handle_sqlalchemy_assertion_error(err):
return make_response(standard_response(None, 400, err.message), 400)
вы можете напрямую добавить пользовательский ответ в функцию abort():
abort(make_response("Integrity Error", 400))
В качестве альтернативы вы можете поместить его в функцию обработчика ошибок
@app.errorhandler(400)
def not_found(error):
resp = make_response("Integrity Error", 400)
return resp
Я знаю, что поздно в игре, но для тех, кто хочет другого решения, моя основана на ответе @codegeek.
В моем модуле ServerResponse.py
я смог выполнить что-то подобное со следующим:
def duplicate(message=""):
response = make_response()
response.status_code = 409
response.headers = {
"X-Status-Reason" : message or "Duplicate entry"
}
abort(response)
то я могу вызвать
ServerResponse.duplicate('Duplicate submission. An article with a similar title already exists.')
это упрощает в моем приложении AngularJS проверку состояния ответа и отображение сообщения X-Status-Reason
по умолчанию или настраиваемого сообщения