Все эти веб приложения и вебсайты по сути умная прослойка между базой данных и клиентом, какие-то данные идут от сервера к клиенту, какие-то от клиента на сервер. Обновить запись в базе данных? Браузер пользователя должен отправить форму или клиент сделать 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))