在 Colander SchemaNode 中操作经过验证的数据

Manipulating validated data in Colander SchemaNode

我有一组 Colander SchemaNodes 在 API 中与 Pyramid/Cornice 一起使用。对于某些查询字符串参数,会传递一个范围(即 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 中使用它,然后使用 @view(schema=TimedThingGet):

将其绑定到我的 Cornice 视图
class TimedThingGet(MappingSchema):
    time = TimeOrRange(missing=drop)

我想做的是更新 TimeOrRange SchemaNode 代码中的 return 值,因此 TimedThingGet 中的 time 是时间范围的元组。换句话说,如果将 time=X-Y 传递给 TimedThingGet 实例,则 time=(x, y) 将在验证数据中 returned。同样,如果只传入X,那么我希望Y设置为now()的纪元。

看起来 set_value() 是可行的方法,这里是问题得到一些额外功劳的地方:

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

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

您可以传递给 SchemaNode 的可调用准备器:

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

这允许您在实例化架构后设置其他属性。