Манипулирование проверенными данными в Colander SchemaNode

У меня есть набор узлов схемы дуршлага, используемых с пирамидой/карнизом в API. Для некоторых аргументов строки запроса передается диапазон (т. е. 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)

Что я хотел бы сделать, так это обновить возвращаемое значение в моем коде TimeOrRange SchemaNode, чтобы time в TimedThingGet был кортежем временных диапазонов. Другими словами, если 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])?

person hamx0r    schedule 09.07.2015    source источник


Ответы (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

Что позволяет вам установить дополнительные свойства после создания экземпляра схемы.

person Ergo    schedule 14.07.2015
comment
Отличный совет. Недостающая часть использования механизма подготовки заключается в том, что необходимо использовать валидатор Function() с пользовательской функцией валидатора для анализа подготовленного значения. Я говорю это только потому, что мой первоначальный вопрос хотел использовать группы из валидатора RegEx, что невозможно напрямую. Обходной путь — использовать регулярное выражение в программе подготовки и сохранять группы, скажем, в список. Пользовательская функция проверки может затем взять список и проверить. - person hamx0r; 17.07.2015