Подтвердить что ты не робот

Как получить доступ к сообщению об ошибке из команды 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 с помощью специального обработчика ошибок

4b9b3361

Ответ 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))