4

我正在尝试使用 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 文档和一些技巧以使其在嵌套字段中工作。

据我了解,这应该开箱即用?我错了吗?我在这里想念什么?

4

1 回答 1

3

我很感激这有点旧,但也有同样的问题。

看起来“验证”实际上位于 python jsonschema impl 上,如果您仍然对挖掘感兴趣,可以在这里找到

除此之外 - 您可以配置 restplus API 以使用更好的格式检查器,如下所示:(我还验证日期时间和日期)

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
)
于 2018-11-01T15:09:31.637 回答