Пропустить проверку модели по умолчанию в Flask Restplus

Из-за специфики проекта мне пришлось написать собственный валидатор модели для приложения Flask-restplus API. Проще говоря - когда возникает ошибка валидации, ее формат и код состояния (400) неправильный. Он должен возвращать объект JSON с сообщениями в определенном формате с кодом состояния 422.

То, что я делаю, примерно так:


ns = api.namespace('somenamespace', description='blabla')

class MyModel(MyBaseModel):
    def __init__(self):
        self.id = fields.Integer()
        self.name = fields.String()


my_model = api.model('MyModel', MyModel())

@api.marshal_list_with(my_model, envelope='json')
@ns.route('/')
class SomeClass(Resource):

    @api.expect(my_model, validate=False)
    @api.doc(responses={
        200: 'Success',
        401: 'Authentication Error',
        403: 'Requested resource unavailable',
        409: 'Conflict, document already exists',
        422: 'Validation Error'
    })
    def post(self):
        """
        Save single document in the database.
        :return:
        """

        request_payload = json.loads(request.data)
        validated_payload, payload_errors = some_validation(request_payload)

        if payload_errors:
            return jsonify(payload_errors), 422
        else:
            return jsonify({'response': 'ok})
Instance of `MyModel` behaves basically like a dict, so no problem in registration. Problem is that when I send data in `-d`, be it through `curl` from command line, or swagger, I constantly get `400` instead of `422`. I assume this is due to the default, built-in validation of input data based on `MyModel`. This is cool, but I have to omit it, and apply my own validation.

person Mateusz Korycinski    schedule 09.01.2019    source источник
comment
Может проблема действительно исходит от MyModel. Вы пробовали как описано в документации декоратора api.expect? flask-restplus.readthedocs.io/en/ стабильный / Он ведет себя так же? Если так, возможно, проблема в другом. Кроме того, можете ли вы указать, какой json вы передаете в своей команде curl?   -  person CloC    schedule 05.02.2019
comment
Спасибо за интерес. В основном все стало работать правильно, когда я отключил глобальную проверку при запуске flask_restplus api. Похоже, что если флаг проверки установлен на True, он не учитывает флаг декоратора @api.expect.   -  person Mateusz Korycinski    schedule 14.02.2019


Ответы (1)


в документации и, как говорит @CloC, один метод определяет модель как

your_model = ns.model('YourModel', {
    'id': fields.Integer(
        description='The user id'
    )
    'name': fields.String(
        description='The user name'
    )
})

... > profit

@ns.route('/', methods=["post"])
@ns.doc(params={
    "id": "the user id (int)",
    "name": "the user name (str)"
})
class SomeClass(Resource):

    @ns.expect(your_model)  # this defines the request 
    # @ns.marshal_list_with(your_model, envelope='json')  # this defines the response
    @ns.response(200, 'Success')
    ... > reponses
    def post(self):
        etc...

        return <response with format as model in marshal>

вы можете захотеть переопределить модель ответа, хотя, если вы не вернете что-то из введенной вами формы ... также, возможно, укажите marshal_with, поскольку вы не возвращаете список?

person rfho_bdss    schedule 30.08.2019