如何发送POST表单中的列表/数组并用Colander解码?我试过好几种方法,但到目前为止运气不好。使用如下表单和Colander模式将引发错误:[1,2,3] is not iterable
示例1.html:

<form action="path_to_page" method="post">
  <input name="ids" type="text" value="[1,2,3]">
  <input type="submit">
</form>

示例1.py:
class IDList(colander.List):
    item = colander.SchemaNode(colander.Integer())

class IDS(colander.MappingSchema):
    ids = colander.SchemaNode(IDList())

而另一种方法根本行不通,因为我们无法创建名为ids[]的Colander节点。
示例2.html:
<form action="path_to_page" method="post">
  <input name="ids[]" type="text" value="1">
  <input name="ids[]" type="text" value="2">
  <input name="ids[]" type="text" value="3">
  <input type="submit">
</form>

有办法完成吗?

最佳答案

注:我用一个广义解更新了这个答案。
为了将URI字符串解析为Colander可以反序列化的可用列表,可以创建一个继承Colander的SquenceSchema的新类,并重写相应的deserialize方法以将逗号分隔的字符串拆分为Python列表:

class URISequenceSchema(SequenceSchema):
    def deserialize(self, cstruct):
        if cstruct:
            cstruct = cstruct.split(',')
        return super(URISequenceSchema, self).deserialize(cstruct)

然后,可以使用这个新类创建任何类型的SequenceSchema,就像使用普通ColanderSequenceSchema一样:
FooSequence(URISequenceSchema):
    foo = SchemaNode(Integer(), validator=Range(min=0))

这将接受一个字符串(例如?ages=23,13,42)并将其解析为一个python列表。
希望这能帮助其他有同样问题的人。

08-24 21:33