Флакон Python и сообщения об ошибках пользовательского клиента

В настоящее время я пишу 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
}

Ответ 1

errorhandler также может принимать тип исключения:

@app.errorhandler(AssertionError)
def handle_sqlalchemy_assertion_error(err):
    return make_response(standard_response(None, 400, err.message), 400)

Ответ 2

вы можете напрямую добавить пользовательский ответ в функцию abort():

abort(make_response("Integrity Error", 400))

В качестве альтернативы вы можете поместить его в функцию обработчика ошибок

@app.errorhandler(400)
def not_found(error):
resp = make_response("Integrity Error", 400)
return resp

Ответ 3

Я знаю, что поздно в игре, но для тех, кто хочет другого решения, моя основана на ответе @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 по умолчанию или настраиваемого сообщения