我尝试使用Flask-RESTPlus 0.10.1创建一个自定义字段,用于在我的API中验证POSTed JSON
以下是基本设置......
from flask_restplus import fields
import re
EMAIL_REGEX = re.compile(r'\S+@\S+\.\S+')
class Email(fields.String):
__schema_type__ = 'string'
__schema_format__ = 'email'
__schema_example__ = 'email@domain.com'
def validate(self, value):
if not value:
return False if self.required else True
if not EMAIL_REGEX.match(value):
return False
return True
我喜欢Swagger UI中上述文档的方式,但我似乎无法弄清楚如何在其上实际使用validate方法。
以下是我如何使用自定义字段。
Json = api.model('Input JSON', {
'subscribers': fields.List(Email),
[...]
})
@api.expect(Json) // validate is globally set to true
def post(self):
pass
我有运气
'subscribers': fields.List(fields.String(pattern='\S+@\S+\.\S+'))
代替,但这并不能让我控制自定义错误消息,我希望它返回该字段不属于电子邮件类型。
我还继续添加了一个自定义validate_payload
函数(在http://aviaryan.in/blog/gsoc/restplus-validation-custom-fields.html中找到),我在POST方法中再次调用(而不是api.expect
)。这需要我复制一些核心功能,并且每次除api.expect
之外调用它以输出正确的Swagger文档和一些技巧,以使其在嵌套字段中工作。
我的理解是这应该开箱即用?我错了吗?我在这里缺少什么?
答案 0 :(得分:1)
我很欣赏这有点旧,但是有同样的问题。
“验证”似乎实际上位于python jsonschema impl上,如果您仍然对挖掘感兴趣,可以使用here
此外-您可以配置restplus API以使用更好的formatchecker,如下所示:(我也验证日期时间和日期)
format_checker = FormatChecker(formats=["date-time", "email", "date"])
api_v1 = Api(
app, version='1.4',
title='[Anon]',
description='[Anon] API for developers',
format_checker=format_checker
)