如何发送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列表。希望这能帮助其他有同样问题的人。