【问题标题】:Manipulating validated data in Colander SchemaNode在滤锅 SchemaNode 中处理经过验证的数据
【发布时间】:2015-07-29 21:48:21
【问题描述】:

我有一组滤锅 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 代码中的返回值,所以TimedThingGet 中的time 是一个时间范围的元组。换句话说,如果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])

【问题讨论】:

    标签: python pyramid colander cornice


    【解决方案1】:

    我认为你应该看看:

    您可以传递给 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

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

    【讨论】:

    • 很好的建议。使用准备器的一个缺点是必须使用带有自定义验证器函数的 Function() 验证器来解析准备好的值。我这么说只是因为我最初的问题是想利用 RegEx 验证器中的组,这是不可能的。解决方法是在准备器中使用正则表达式并将组保存到例如列表中。然后,自定义验证器函数可以获取列表并进行验证。
    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 2015-12-18
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多