用Colander接受列表作为URL参数

时间:2018-08-24 13:54:38

标签: python colander

我正在尝试使用Colander作为验证后端接受以下Python dict的URL序列化版本:

{'foo': [1,2,3]}

我解决此问题的方法主要是在各种配置中使用colander.SequenceSchema,没有一种会产生很有意义的错误:

# first approach
class ListItem(colander.MappingSchema):
    item = colander.SchemaNode(colander.Int())

class ListContainer(colander.SequenceSchema):
    items = ListItem()

# second approach
class ListContainer(colander.SequenceSchema):
    items = colander.SchemaNode(colander.Int())

# third approach
colander.SchemaNode(
    colander.Mapping(),
    colander.SchemaNode(
        colander.Sequence(),
        typ=colander.Int(),
        name=my_param_name
    )
)

我实际上很确定前两种方法是等效的。

就实际验证这一点而言,我尝试使用在params调用中传递给requests.get kwarg的许多结构:

  • my_param_name = [1,2,3]
  • my_param_name = [(my_param_name, 1), (my_param_name, 2), (my_param_name, 3)]
  • my_param_name = {my_param_name: [1,2,3]}

在每种情况下,漏勺都会在my_param_name: u'"1" is not iterable'上吐出一些变化,在最后一种情况下,my_param_name: u'"[1,2,3]" is not iterable'会吐出一些变化。此错误非常令人讨厌,并且the docs并没有概述SequenceSchema(甚至是colander.List)用于将数组作为URL参数中的值接受的正确用例,并且由于Colander相对由于采用率较低,因此很难在网络上找到以这种方式使用其中任何一个的项目。

使用Colander通过验证时,是否可以接受标量原始值列表作为URL参数的值?

0 个答案:

没有答案