Social Profiles

My Projects

Использование Schematics для валидации данных

Все эти веб приложения и вебсайты по сути умная прослойка между базой данных и клиентом, какие-то данные идут от сервера к клиенту, какие-то от клиента на сервер. Обновить запись в базе данных? Браузер пользователя должен отправить форму или клиент сделать PUT к API. В любом случае необходимо или хотя бы очень желательно проверять соответствуют ли данные требуемой структуре, или пришла какая-то ерунда. Короче говоря имеется типичная задача - валидация данных, перед тем как отправить их дальше, особенно это актуально для schema-less баз данных, таких как MongoDB. Данные предварительно можно валидировать само собой и на клиенте, но это легко обходится используя curl или какой-нибудь плагин к браузеру (вроде RESTClient для FF). Поэтому основная борьба за чистоту данных и свободу от ошибок идет на server-side. Если вы используете комплексный фрэймворк вроде Django, то там скорее всего уже есть возможность проводить валидацию, на уровне форм и моделей. Но если вы используете один из множества микрофрэймворков, то скорее всего встроенной возможности для валидации нет.

Вот как раз для таких случаев есть готовое "standalone" решение - schematics

>>> from schematics.models import Model
>>> from schematics.types import StringType
>>> class Person(Model):
...     name = StringType(required=True)
...
>>> person = Person({"name": u"Dino Spomoni"})
>>> person.name
u"Dino Spomoni"
>>> person = Person()
>>> try:
...     person.validate()
... except ValidationError, e:
...     print e.messages
{"name": [u"This field is required."]}

Документация на данный момент не очень полная и не точно соответствует текущей dev версии - schematics documentation. Поэтому лучше и полезнее сразу смотреть код библиотеки на github.

Использование schematics:

  • Валидация данных перед записью в базу данных
  • Валидация данных которые приходят от клиента (запрос к API, сабмит формы)
  • Использование whitelist и blacklist для преобразования данных с учетом уровней доступа клиента
  • Использование schematics для описания моделей для schema-less/key-value баз данных.

С учетом того, что schematics весьма просто расширяется и можно писать собственные валидаторы, то область применения может быть гораздо шире чем я предполагаю.

И в конце, "живой" пример кастомного валидатора из реального проекта. Проверяет содержит ли логин пользователя что-то кроме цифр, букв и символов _ и -.

def validate_login(self, value):
    replace_non_alpha = {"_": "", "-": ""}
    login_normalized = reduce(
        lambda a, kv: a.replace(*kv),
        replace_non_alpha.iteritems(), value)

    if not login_normalized.isalnum():
        raise ValidationError("Login {} contains wrong characters".format(value))
comments powered by Disqus