使用Coland接受列表作为URL参数

2024-04-18 05:17:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

{'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
    )
)

实际上,我相当肯定前两种方法是等价的。你知道吗

为了实际验证这一点,我尝试在requests.get调用中使用传递给paramskwarg的许多结构:

  • 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]}

在每种情况下,Colander都会在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的采用率相对较低,在web上很难找到以这种方式使用其中任何一种的项目。你知道吗

在使用Colander传递验证时,是否可以接受标量原语值列表作为URL参数的值?你知道吗


Tags: 方法nameurlparammy错误classint