1

I'm trying to accept a URL-serialized version of the following Python dict using Colander as my validation backend:

{'foo': [1,2,3]}

The way I've approached this was primarily using colander.SequenceSchema in various configurations, none of which produce errors that make much sense:

# 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
    )
)

I'm actually fairly sure the first two approaches are equivalent.

In terms of actually validating this, I've tried using a number of structures passed to the params kwarg on a requests.get call:

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

In every case, Colander will spit out some variation upon my_param_name: u'"1" is not iterable', or in the last case, my_param_name: u'"[1,2,3]" is not iterable'. This error is very obtuse, and the docs don't outline a correct use case for SequenceSchema (or even colander.List) for accepting arrays as values in a URL parameter, and because of Colander's relatively low adoption, it's difficult to find a project on the web which uses either of these in this way.

Is it possible to accept a list of scalar, primitive values as the value of a URL parameter while passing validation using Colander?

0xdd
  • 311
  • 3
  • 15

0 Answers0