3

如何以 POST 形式发送列表/数组并使用滤锅对其进行解码?我已经尝试了几种方法,但到目前为止没有运气。使用如下形式的表单和滤锅架构将引发错误:[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[].

示例_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>

有没有办法做到这一点?

4

1 回答 1

3

注意:我已经用通用解决方案更新了这个答案。

为了将 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任何类型的 a ,就像使用普通 Colander 一样SequenceSchema

FooSequence(URISequenceSchema):
    foo = SchemaNode(Integer(), validator=Range(min=0))

这将接受一个字符串(例如?ages=23,13,42)并将其解析为一个 python 列表。

希望这可以帮助其他有同样问题的人。

于 2015-09-21T18:38:34.940 回答