棉花糖中字符串的简单数组验证

2024-09-30 22:25:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我们正在进行一系列API调用,在进行API调用之前,需要根据基于棉花糖(3.7.0)的模式验证传递的数据。大多数架构定义的格式如下:

class SomeSchema(Schema):
    Field1 = fields.Str(default='')
    Field2 = fields.Str(default='', missing='', allow_none=True)
    Field3 = fields.Int()
    etc

但是,我们有一个小的例外,API调用只需要一个未命名的字符串列表,比如:

["abc", "def", "ghi", ...]

为了保持验证输入前后的一致性,我希望继续使用marhmallow,即使是在这个简单的情况下。我认为这样一个简单的模式是可行的:

class MySimpleSchema(Schema):
    fields.List(fields.Str(default=''))

但是,在运行以下代码时,我会出现以下错误:

my_schema = MySimpleSchema()
my_simple_list = ["item1","item1","item1"]
data = my_schema.load(my_simple_list)

validation error: {'_schema': ['Invalid input type.']}

欢迎提出任何意见


Tags: 数据apidefaultfieldsschemamy模式simple
1条回答
网友
1楼 · 发布于 2024-09-30 22:25:40

加载时,即反序列化对象时,Marshmallow的load方法expects a dictionary(或者在^{}的情况下,包含字典的字符串)

因此,需要进行几项更改:

  1. 在模式的定义中,除了将字段定义为属性外,没有其他方法:
class MySimpleSchema(Schema):
    field1 = fields.List(fields.Str(default=''))
  1. 使用字典调用load,例如:
my_schema = MySimpleSchema()
data = {"field1": ["item1", "item2", "item3"]}
data = my_schema.load(data)

在您的例子中,如果您确实想使用棉花糖进行验证,可以首先将未命名的字符串列表包装到字典中(请注意,键必须与模式中定义的字段相匹配)。因此,类似这样的方法会起作用:

my_schema = MySimpleSchema()
my_simple_list = ["item1","item1","item1"]
data = my_schema.load({"field1": my_simple_list})

此外,如果您只想验证输入数据而不进行反序列化,可以使用Schema.validate()

my_simple_list = [1,"item1","item1"]
errors = my_schema.validate({"field1": my_simple_list})
print(errors)

输出:

marshmallow.exceptions.ValidationError: {'field1': {0: ['Not a valid string.']}}

相关问题 更多 >