跳过Flask Restplus中的默认模型验证

时间:2019-01-09 10:10:07

标签: python python-3.x flask flask-restful 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})
MyModel实例的行为基本上像字典,因此注册没有问题。问题是,当我在命令行中通过`curl`或摇摇晃晃地在`-d`中发送数据时,我总是得到`400`而不是`422`。我认为这是由于基于MyModel的输入数据的默认内置验证所致。这很酷,但是我必须忽略它,并应用自己的验证。

1 个答案:

答案 0 :(得分:0)

在文档中,正如@CloC所说,一种方法是将模型指定为

x=20,y=30,height=100,width=100

尽管您可能想重新定义响应模型,除非您将返回您放入的某种形式的表格。也可能指定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> ,因为您不返回列表?