Python 在Colander模式中操作验证数据

Python 在Colander模式中操作验证数据,python,pyramid,colander,cornice,Python,Pyramid,Colander,Cornice,我有一套Colander SchemaNodes,用于API中的金字塔/檐口。对于某些查询字符串arg,传递一个范围(即time=X-Y表示从X到Y的时间范围,其中X和Y是表示年代的整数)。我目前使用RegEx()验证器来验证这一点,以确保传入一个历元或历元范围: class TimeOrRange(SchemaNode): schema_type = String location = "querystring" description = 'Time (or rang

我有一套Colander SchemaNodes,用于API中的金字塔/檐口。对于某些查询字符串arg,传递一个范围(即
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}$")
然后,我在一个映射模式中使用它,然后通过
@view(schema=TimedThingGet)
将其绑定到我的檐口视图:

我想做的是更新我的
TimeOrRange
schemaode中的返回值,以便
TimedThingGet
中的
time
是一个时间范围的元组。换句话说,如果将
time=X-Y
传递给
TimedThingGet
实例,则
time=(X,Y)
将在验证数据中返回。类似地,如果只传入
X
,那么我希望
Y
设置为
now()的纪元

看起来
set_value()
是解决问题的方法,这里是问题的地方,这里有一些额外的积分:

  • 验证之前或之后是否调用
    设置\u值
  • set\u value
    是否有权访问验证程序,以便创建正则表达式组的
    RegEx验证程序可以用来设置我的元组:
    time=(validated.match.group[1],validated.match.group[2])

  • 我想你应该看看:

    您可以传递给SchemaAnode的可调用制备程序:

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

    以及(可选)在:


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

    非常好的建议。使用preparer的一个不足之处是必须将Function()validator与自定义验证器函数一起使用,以解析准备好的值。我之所以这样说,只是因为我最初的问题想利用来自RegEx验证器的组,这是不可能的。解决方法是在制备程序中使用正则表达式,并将组保存到(比如)列表中。然后,自定义验证器函数可以获取列表并进行验证。
    class TimedThingGet(MappingSchema):
        time = TimeOrRange(missing=drop)