Marshmallow 中的简单字符串验证数组

Simple array of strings validation in Marshmallow

我们正在进行一系列 API 调用,这将要求在我们进行 API 调用之前根据基于 Marshmallow (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.']}

欢迎任何想法。

加载时,即反序列化对象,Marshmallow 的load 方法expects a dictionary (or a string containing a dictionary, in the case of loads).

因此需要进行一些更改:

  1. 在schema的定义中,没有别的办法,只能将字段定义为属性:
class MySimpleSchema(Schema):
    field1 = fields.List(fields.Str(default=''))
  1. 用字典调用load,例如:
my_schema = MySimpleSchema()
data = {"field1": ["item1", "item2", "item3"]}
data = my_schema.load(data)

在你的情况下,如果你真的想使用 Marshmallow 进行验证,你可以首先将未命名的字符串列表包装在字典中(注意键必须与模式中定义的字段匹配)。所以这样的事情会起作用:

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.']}}