2

我在 API 中有一组与 Pyramid/Cornice 一起使用的滤锅 SchemaNode。对于某些查询字符串参数,传递一个范围(即time=X-Y表示从 X 到 Y 的时间范围,其中 X 和 Y 是表示时期的整数)。我目前使用验证器对此进行RegEx()验证,以确保传入一个纪元或纪元范围:

class TimeOrRange(SchemaNode):
    schema_type = String
    location = "querystring"
    description = 'Time (or range) in epochs: ssssssssss(-ssssssssss)'
    validator = Regex("^[0-9]{10}\-{0,1}[0-9]{0,10}$")

然后我在 MappingSchema 中使用它,然后将其绑定到我的 Cornice 视图@view(schema=TimedThingGet)

class TimedThingGet(MappingSchema):
    time = TimeOrRange(missing=drop)

我想做的是更新我的TimeOrRangeSchemaNode 代码中的返回值,所以timeinTimedThingGet是时间范围的元组。换句话说,如果time=X-Y传递给TimedThingGet实例,则time=(x, y)在验证数据中返回。同样,如果只X传入,那么我想Y设置为now().

看起来set_value()是要走的路,这就是问题得到一些额外功劳的地方:

  1. set_value是在验证之前还是之后被调用?
  2. 是否set_value有权访问验证器,以便RegEx可以使用创建正则表达式组的验证器来设置我的元组:time=(validated.match.group[1], validated.match.group[2])
4

1 回答 1

1

我认为你实际上应该看看:

您可以传递给 SchemaNode 的 Preparer 可调用对象:

http://docs.pylonsproject.org/projects/colander/en/latest/interfaces.html?highlight=preparer#colander.interfaces.Preparer

它将允许您在将数据传递给验证器之前对其进行操作

并可选择在:

http://docs.pylonsproject.org/projects/colander/en/latest/binding.html#what-is-schema-binding

它允许您在模式实例化后设置其他属性。

于 2015-07-14T22:59:52.583 回答