【发布时间】:2019-01-09 10:10:06
【问题描述】:
由于项目的特殊性,我必须为 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` 的实例基本上表现得像一个字典,所以注册没有问题。问题是当我在`-d`中发送数据时,无论是通过命令行的`curl`还是swagger,我总是得到`400`而不是`422`。我认为这是由于基于“MyModel”的输入数据的默认内置验证。这很酷,但我必须省略它,并应用我自己的验证。
【问题讨论】:
-
也许问题确实来自
MyModel。您是否尝试过装饰器api.expect文档中描述的方式? flask-restplus.readthedocs.io/en/stable/… 它的行为是否相同?如果是这样,那么问题可能来自其他地方。另外,你能指定你在curl命令中传递的json是什么吗? -
感谢您的关注。当我在启动
flask_restplusapi 时全局关闭验证时,基本上一切都开始正常工作了。似乎如果 validate 标志设置为 True,它不会考虑来自@api.expect装饰器的标志。
标签: python python-3.x flask flask-restful flask-restplus