Из-за специфики проекта мне пришлось написать собственный валидатор модели для приложения 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.
MyModel
. Вы пробовали как описано в документации декоратораapi.expect
? flask-restplus.readthedocs.io/en/ стабильный / Он ведет себя так же? Если так, возможно, проблема в другом. Кроме того, можете ли вы указать, какой json вы передаете в своей командеcurl
? - person CloC   schedule 05.02.2019flask_restplus
api. Похоже, что если флаг проверки установлен на True, он не учитывает флаг декоратора@api.expect
. - person Mateusz Korycinski   schedule 14.02.2019