Как получить доступ к сообщению об ошибке из команды abort при использовании настраиваемого обработчика ошибок
Используя сервер флагов python, я хочу, чтобы у вас была возможность отправить ответ об ошибке HTTP с помощью команды abort и использовать пользовательскую строку ответа и пользовательское сообщение в теле
@app.errorhandler(400)
def custom400(error):
response = jsonify({'message': error.message})
response.status_code = 404
response.status = 'error.Bad Request'
return response
abort(400,'{"message":"custom error message to appear in body"}')
Но переменная error.message появляется как пустая строка. Я не могу найти документацию о том, как получить доступ ко второй переменной функции abort с помощью специального обработчика ошибок
Ответы
Ответ 1
Если вы посмотрите flask/__init__.py
, вы увидите, что abort
фактически импортируется из werkzeug.exceptions
. Глядя на класс Aborter
, мы видим, что при вызове с числовым кодом конкретный подкласс HTTPException
просматривается и вызывается со всеми аргументами к экземпляру Aborter
. Рассматривая HTTPException
, обращая особое внимание на линии 85-89, мы видим, что второй аргумент передан до HTTPException.__init__
сохраняется в свойстве description
, как указывал @dirn.
Вы можете либо получить доступ к сообщению из свойства description
:
@app.errorhandler(400)
def custom400(error):
response = jsonify({'message': error.description['message']})
# etc.
abort(400, {'message': 'custom error message to appear in body'})
или просто выполните описание самостоятельно:
@app.errorhandler(400)
def custom400(error):
response = jsonify({'message': error.description})
# etc.
abort(400, 'custom error message to appear in body')
Ответ 2
Люди слишком полагаются на abort()
. Правда в том, что есть гораздо лучшие способы обработки ошибок.
Например, вы можете написать эту вспомогательную функцию:
def bad_request(message):
response = jsonify({'message': message})
response.status_code = 400
return response
Тогда из вашей функции просмотра вы можете вернуть ошибку:
@app.route('/')
def index():
if error_condition:
return bad_request('message that appears in body')
Если ошибка возникает глубже в стеке вызовов в месте, где возврат ответа невозможен, вы можете использовать пользовательское исключение. Например:
class BadRequestError(ValueError):
pass
@app.errorhandler(BadRequestError)
def bad_request_handler(error):
return bad_request(str(error))
Затем в функции, которая должна выдать ошибку, вы просто вызываете исключение:
def some_function():
if error_condition:
raise BadRequestError('message that appears in the body')
Надеюсь, это поможет.
Ответ 3
Я просто делаю это так:
abort(400, description="Required parameter is missing")
Ответ 4
flask.abort
также принимает flask.Response
abort(make_response(jsonify(message="Error message"), 400))