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
).
因此需要进行一些更改:
- 在schema的定义中,没有别的办法,只能将字段定义为属性:
class MySimpleSchema(Schema):
field1 = fields.List(fields.Str(default=''))
- 用字典调用
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.']}}
我们正在进行一系列 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
).
因此需要进行一些更改:
- 在schema的定义中,没有别的办法,只能将字段定义为属性:
class MySimpleSchema(Schema):
field1 = fields.List(fields.Str(default=''))
- 用字典调用
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.']}}