如何在POST表单中发送列表/数组并使用Colander进行解码?我已经尝试了几种方法但到目前为止没有运气。使用如下所示的表单和Colander架构将引发错误:[1,2,3] is not iterable
example_1.html:
<form action="path_to_page" method="post">
<input name="ids" type="text" value="[1,2,3]">
<input type="submit">
</form>
example_1.py:
class IDList(colander.List):
item = colander.SchemaNode(colander.Integer())
class IDS(colander.MappingSchema):
ids = colander.SchemaNode(IDList())
而另一种方法根本无法工作,因为我们无法创建一个名为ids[]
的漏勺节点。
example_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>
有没有办法完成这项工作?
答案 0 :(得分:2)
注意:我已使用通用解决方案更新了此答案。
为了将一个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
,就像使用普通滤网SequenceSchema
一样:
FooSequence(URISequenceSchema):
foo = SchemaNode(Integer(), validator=Range(min=0))
这将接受一个字符串(例如?ages=23,13,42
)并将其解析为python列表。
希望这可以帮助其他遇到同样问题的人。