表单编码复合验证器在模式内
我正在尝试做一件我认为应该很简单的事情,但在实现过程中遇到了一些问题。现在我有的代码是这样的,它的运行效果是我预期的。
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'])
)
效果如预期。