由于项目的特殊性,我必须为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的输入数据的默认内置验证所致。这很酷,但是我必须忽略它,并应用自己的验证。
答案 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>
,因为您不返回列表?