В этом коротком (практическом) руководстве я дам вам очень простое введение в использование замечательной библиотеки C erberus для определения и проверки моделей данных в python. Я буду использовать платформу PythonOnWheels для простого создания моделей, но схемы и проверка Cerberus также будут работать без PythonOnWheels.

Так что это за штука с Цербером?

Cerberus - это легкая и расширяемая библиотека проверки данных для Python.

Это очень удобно и полезно, а также упрощает определение схем, включая имена атрибутов, типы данных и правила проверки. Поскольку это действительно удобный и питонический способ работы с данными в вашем приложении:

А что это за штука PythonOnWheels?

PythonOnWheels - это слой клея вокруг некоторых замечательных существующих библиотек / модулей и инструментов, облегчающий жизнь вашего Python для выполнения скучных задач.

А поскольку он питонический, он очень прост в использовании и очень полезен.

PythonOnWheels использует схемы Cerberus для всех определений моделей, будь то SQL или NoSQL.

Это не только дает вам преимущество использования одной и той же схемы определения модели для NoSQL и всех баз данных SQL, но также означает, что у вас есть встроенная проверка для каждой модели, и вы можете легко переключаться с SQL на NoSQL

Чтобы следовать практической части, вы можете использовать PythonOnWheels

Если вы не знаете, как:

  • установить PythonOnWheels прочитайте супер-короткий Get_started
  • создать новое приложение (в этом руководстве я назвал свое testapp)

Вы также можете следовать руководству без PythonOnWheels.

в этом случае вам необходимо установить Cerberus (и создать валидатор, см. ниже)

$ pip install cerberus

Затем вы можете проверить схемы, подобные этой (просто вырежьте и вставьте их в свой интерпретатор python)

>>> schema={ .... take some sample schema from below ... }
>>> d={}                  # create a dict (instead of a real model)
>>> d["title"] = "test"   # set some attribures
>>> from cerberus import Validator
>>> v=Validator()
>>> v.schema=schema
>>> v.validate(d)
True
>>>

Начнем с действия:

Для этого урока я создал модель TinyDB (NoSQL DB) следующим образом:

python generate_model.py -n todo -t tinydb

TinyDB - это сверхмаленькая файловая база данных документов (NoSQL). Вы можете думать об этом как о SQlite от NoSQL;).

А вот так выглядит сгенерированная схема модели:

# 
# TinyDB Model:  Todo 
# 
from testapp.models.tinydb.tinymodel import TinyModel 
class Todo(TinyModel): 
    # 
    # Use the cerberus schema style  
    # 
    schema = { 
        'title' :   { 'type' : 'string', 'maxlength' : 35 }, 
        'text'  :   { 'type' : 'string' }, 
        'tags'  :   { 'type' : 'list', "default" : [] }, 
        "votes" :   { "type" : "integer", "default" : 0 }    
        }

Примечание: модель PythonOnWheels SQL будет использовать точно такой же синтаксис определения.

Итак, с нашей схемой cerberus мы можем:

  • определить свои атрибуты и их типы данных (например, «заголовок», «тип»: «строка»)
  • определить ограничения атрибутов и правила проверки («maxlength» = 35)
  • все в сжатой и проверенной форме с использованием широко используемой библиотеки Python.
  • и использовать одну и ту же схему определения модели для моделей SQL и NoSQL.

Что PythonOnWheels делает за кулисами

На основе схем Cerberus PythonOnWheels генерирует фактическое представление модели, необходимое для различных баз данных. Итак, когда вы определяете модель, подобную приведенной выше. PoW генерирует правильную схему mongoDB, tinyDB, SQL (sqlalchemy) или эластичную схему в фоновом режиме, которая фактически используется для работы с выбранной вами базой данных.

Но поскольку все дело в проверке, в дальнейшем нас это не волнует.

Итак, давайте воспользуемся проверкой

Давайте еще раз посмотрим на определение схемы нашей модели, потому что проверка использует наше определение, чтобы проверить, правильный фактический экземпляр модели или нет.

Адаптируйте схему, чтобы она выглядела так:

schema = {         
        'title' :   { 'type' : 'string', 'maxlength' : 35 }, 
        'text'  :   { 'type' : 'string' }, 
        "status":   { "type" : "string", "default" : "new",   
                      "allowed" : ["new", "wip", "done", "hold"]}, 
        "votes":   { "type" : "integer", "default" : 0 }   
    }

Чтобы упростить это, просто скопируйте и замените всю схему.

Но мы просто переименовываем теги в status и добавляем определение «разрешено»: [«новый», «очистить», «готово», «удерживать»].

Вот как это выглядит: (в проводнике вы видите путь к models / tinydb / todo.py)

Имена и типы атрибутов

Вы можете видеть, что мы определили четыре атрибута , named: title, text, status и голосов. Дополнительно мы определили их типы. Три из них - строки, только атрибут points имеет тип integer .

Ограничения атрибутов

Для некоторых атрибутов, в данном случае title и status, мы также определили ограничения . Ограничения в основном просто сужают допустимые значения для типа атрибута.

Для атрибута title типом должна быть строка с ограничением, что она не может быть длиннее 35 символов.

Атрибут статуса также должен иметь тип строки, но он также проверяет только то, является ли строка одним из допустимых: «новая», «очистить», «готово» или «удерживать».

Поскольку мы используем Cerberus, вы можете полагаться на гораздо больше возможных определений ограничений. Просто прочтите полную документацию по правилам валидации.

Давайте протестируем реальный образец модели

Запустите интерпретатор Python и импортируйте свою модель. Если вы не знаете, как создать приложение PythonOnWheels, прочтите 2-х минутное вступление. См. Выше, как создать модель.

>>> from testapp.models.tinydb.todo import Todo

Создать экземпляр

>>> t=Todo()

Давайте рассмотрим схему для атрибута статуса:

"status":   { "type" : "string", "default" : "new", "allowed" : ["new", "wip", "done", "hold"]},

Как вы знаете, здесь status определяется тип string AND принимает только разрешенные значения, которые находятся в этом case: новый, очистить, готово и удерживать. Любое другое значение будет считаться ложным.

Покажем, как выглядит экземпляр t: (по умолчанию)

>>> t 
{ '_uuid': '', 
 'created_at': datetime.datetime(2019, 9, 4, 21, 25, 10, 6827), 
 'id': '', 
 'last_updated': datetime.datetime(2019, 9, 4, 21, 25, 10, 6827), 
 'status': 'new', 
 'text': '', 
 'title': '', 
 'votes': 0}

Вы можете видеть, что PythonOnWheel добавляет некоторые дополнительные параметры (created_at, last_updated и _uuid) и что по умолчанию для статуса установлено «новое», а для голосов - 0. Как и определено.

Итак, давайте проверим модель, чтобы убедиться, что она принята.

>>> t.validate()
True

Метод validate () модели возвращает True, что означает, что проверка прошла успешно, в противном случае - False.

Давайте изменим некоторые атрибуты

>>> t.title="123456789012345678901234567890123456"
>>> t.status="yihaa"

Еще раз подтвердите модель, чтобы убедиться, что она принята.

>>> t.validate()
False

Хорошо, на этот раз проверка не удалась. Итак, как мы можем увидеть, что именно пошло не так?

Проверить результат валидации

>>> t.validator.errors
{'status': ['unallowed value yihaa'], 'title': ['max length is 35']}

Просто откройте атрибут errors валидатора моделей, чтобы узнать, какие правила проверки завершились ошибкой. Это также отличный способ автоматически возвращать простые сообщения об ошибках, например. для веб-формы или в ответе JSON.

Давайте теперь исправим ошибки и посмотрим, сможем ли мы подтвердить значение True.

  • Измените статус на что-нибудь разрешенное, например "Выполнено"
  • Измените заголовок на что-нибудь, содержащее менее 35 символов.
>>> t.title="test"
>>> t.status="done"

Давай еще раз проверим

>>> t.validate() 
True

Превосходно, теперь наша задача прошла проверку.

Это оно. Мы определили модели, типы атрибутов и правила проверки (ограничения) и проверили их. Мы также узнали, как получить доступ к конкретным ошибкам, которые мы допустили.

С Cerberus вы можете сделать гораздо больше. И вы можете сделать гораздо больше с PythonOnWheels. Но для моих сценариев использования мне в основном нужны базовые вещи, и это уже очень помогает.

Резюме

Надеюсь, вы согласны с тем, что использование схем Cerberus действительно упрощает элегантное определение моделей баз данных, но также дает нам много преимуществ при проверке.

Синтаксис схемы очень прост, в нем используются типы данных, доступные в python, и легко запоминаются такие ограничения, как allowed, maxlength, anyof и т. Д. См. Документацию по правилам проверки Cerberus здесь.

Итак, наконец, мы можем безопасно сохранить модель в БД.

В PythonOnWheels это довольно просто. Просто сделайте upsert () и вперед.

>>> t.upsert()
insert, new eid: 1

Сделанный! ;)

Если вы хотите узнать больше о данных, базе данных и обработке моделей в PythonOnWheels, я бы рекомендовал прочитать эти короткие практические руководства. (всего около 5–10 минут)

Надеюсь, вам понравился учебник и PythonOnWheels. Если у вас есть какие-либо вопросы, замечания или ошибки, вы можете открыть вопрос на github или написать твит на @pythononwheels.