如何解决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",...]
为了保持验证输入的一致性,我想继续使用棉花糖,即使是这种简单的情况。我认为像这样的简单模式会起作用:
class MySimpleSchema(Schema):
fields.List(fields.Str(default=''))
但是,当运行以下代码时,我最终会出现以下错误:
my_schema = MySimpleSchema()
my_simple_list = ["item1","item1","item1"]
data = my_schema.load(my_simple_list)
验证错误:{'_schema': ['输入类型无效。']}
感谢任何想法。
解决方法
加载时,即反序列化对象时,Marshmallow 的 load
方法 expects a dictionary(或包含字典的字符串,在 loads
的情况下)。
因此需要进行一些更改:
- 在架构的定义中,除了将字段定义为属性之外别无他法:
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"]
errors = my_schema.validate({"field1": my_simple_list})
print(errors)
输出:
marshmallow.exceptions.ValidationError: {'field1': {0: ['Not a valid string.']}}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。