表单编码复合验证器在模式内

2 投票
1 回答
533 浏览
提问于 2025-04-18 06:00

我正在尝试做一件我认为应该很简单的事情,但在实现过程中遇到了一些问题。现在我有的代码是这样的,它的运行效果是我预期的。

some_schema = Schema(

   multiples = ForEach(UnicodeString(), convert_to_list=True),
   single = OneOf(['a', 'b'])

)

我想在将多个值的字段转换为unicode字符串列表后,应用一个最大长度的验证器。但是,我尝试使用复合验证器(比如All、Pipe)或自定义验证器时,它似乎都不太喜欢。在我看来,这里有一个最简单的方法来实现这个目标。

some_schema = Schema(

   multiples = All(MaxLength(5), ForEach(UnicodeString(), convert_to_list=True)),
   single = OneOf(['a', 'b'])

)

根据文档,多个值的字段应该被转换为unicode字符串的列表,然后通过最大长度验证器进行检查,如果元素数量超过5个就会失败。失败的部分是可以正常工作的:

>>> some_schema.to_python({'single':'a', 'multiples': range(6)})
>>> Invalid: multiples: Enter a value less than 5 characters long

然而,一个看起来应该通过的例子实际上却失败了:

>>> some_schema.to_python({'single':'a', 'multiples': range(3)})
>>> Invalid: multiples: Please provide only one value

虽然formencode的文档通常很不错,但在这个问题上并没有提供太多帮助。查看源代码后,我发现这是Schema类中一个期望单个值的异常。我尝试给Schema传递accepts_iterator=True这个参数,但那也失败了。

我该如何确保模式中的一个字段是unicode字符串的列表,并且长度小于N呢?

1 个回答

1

我自己回答了自己的问题 - 你需要给 MaxLength 验证器提供 accepts_iterator 这个关键词。

some_schema = Schema(

   multiples = All(MaxLength(5, accepts_iterator=True), ForEach(UnicodeString(), convert_to_list=True)),
   single = OneOf(['a', 'b'])

)

效果如预期。

撰写回答