marshmallow ValidationError неправильно обрабатывается обработчиком ошибок фляги

Не знаю, имеет ли это значение, но на самом деле я использую расширение flask-restplus.

Все мои другие обработчики ошибок фляги работают, как и ожидалось, но по какой-то причине при обработке marshmallow ValidationError ответом является только мое исходное тело запроса, а не сообщение об ошибке зефира. Я выполнил некоторую отладку и знаю, что вызывается обработчик ошибок и что атрибуты ValidationError доступны (например, проверено, что error.messages равно {'age': ['Missing data for required field.']}).

Кто-нибудь испытал это раньше? Спасибо за чтение, и заранее спасибо за любую помощь!

Полезная нагрузка:

{"name": "Bob"}

Обработчик ошибок:

from marshmallow.exceptions import ValidationError

@api.errorhandler(ValidationError)
def marshmallow_error_handler(error):
    # print(error.messages) results in expected {'age': ['Missing data for required field.']}
    return error.messages, 400

Схема:

class SimpleSchema(Schema):
    name = fields.String(required=True)
    age = fields.String(required=True)

Простой путь к тестовому обработчику:

@api.route("/test")
class MarshmallowTest(Resource):
    def post(self):
        SimpleSchema().load(api.payload)

Ожидаемый ответ:

{'age': ['Missing data for required field.']}

Фактический ответ:

{"name": "Bob"}

Мне удалось обойти это, переопределив функцию handle_error marshmallow.Schema и вызвав пользовательское исключение, но мне все еще очень любопытно, что вызывает такое поведение!


person LRH    schedule 27.10.2020    source источник


Ответы (1)


Я также столкнулся с этой ошибкой и нашел эту проблему Github https://github.com/noirbizarre/flask-restplus/issues/530

Обходной путь, который я использовал, перезаписывает свойство data исключения в моем собственном обработчике.

    @api.errorhandler(Exception)
    def handle_unexpected_within_restx(e):
        app.logger.exception(e)
        
        data = compose_error_response(e.messages)
        # https://github.com/noirbizarre/flask-restplus/issues/530
        e.data = data
        return data, 400
person ken4z    schedule 27.04.2021