Введение в Pydantic: мощная проверка данных для ваших REST API 2023

Введение в Pydantic: мощная проверка данных для ваших REST API 2023

Введение в Pydantic

Pydantic — это библиотека Python, созданная Сэмюэлем Колвином, которая упрощает процесс проверки данных. Это универсальный инструмент, который можно использовать в различных сферах, таких как создание API, работа с базами данных и обработка данных в проектах. Библиотека имеет простой и интуитивно понятный синтаксис, позволяющий легко определять и проверять модели данных. Она включает в себя возможность указывать типы, значения по умолчанию и ограничения непосредственно в коде, что делает его понятным и удобным в сопровождении.

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

Особенности Pydantic

Pydantic — это библиотека Python, которая предоставляет ряд функций проверки и анализа данных. Вот некоторые из основных особенностей Pydantic:

  • Проверка данных: Pydantic включает функцию проверки, которая автоматически проверяет типы и значения атрибутов класса, гарантируя их правильность и соответствие любым заданным ограничениям. Также поддерживаются настраиваемые правила проверки с использованием подсказок, что позволяет пользователям определять дополнительные ограничения для своих данных.
  • Поддержка комплексных чисел. Поддерживает широкий спектр типов данных, включая списки, словари и вложенные модели, что упрощает определение и проверку сложных структур данных.
  • Эффективность и лёгкость: Pydantic спроектирован так, чтобы быть быстрым и эффективным, с небольшой кодовой базой и минимальным количеством зависимостей. Он также хорошо документирован и прост в использовании, что делает его популярным выбором для проверки и анализа данных в Python.
  • Открытый исходный код: Pydantic — это библиотека с открытым исходным кодом, лицензированная в соответствии с лицензией MIT, которая активно разрабатывается и поддерживается сообществом участников.

Pydantic vs Python Data Classes

Python data classes — это способ определения классов, которые используются для хранения данных. Он был представлен в Python 3.7 декоратором @dataclass. Этот декоратор автоматически генерирует метод __init__ , метод __repr__ и методы сравнения, что упрощает определение классов, которым нужно только хранить данные. Кроме того, модуль dataclasses предоставляет вспомогательные функции, такие как dataclasses.asdict() и dataclasses.replace(), которые можно использовать для преобразования экземпляра класса в словарь или для создания нового экземпляра из класса с обновлениями полей. Это делает data classes удобным способом создания простых классов, которым нужно только хранить данные и не требуется никакого другого взаимодействия.

Pydantic — это библиотека, построенная на основе классов данных Python и добавляющая дополнительные функции для валидации и анализа данных. Pydantic предоставляет специальный класс BaseModel, который можно использовать для определения моделей данных и правил их проверки. Правила проверки могут быть определены путём установки типов и ограничений для атрибутов класса. Эта библиотека также обеспечивает поддержку синтаксического анализа данных из таких источников, как JSON, и может преобразовывать проанализированные данные в экземпляр определённой модели данных. Кроме того, из модели данных можно создать схему JSON, которую можно использовать для проверки входных данных на основе схемы.

В целом, Pydantic — это библиотека, которая добавляет в Python дополнительные функции для проверки и анализа данных. В то время как data classes Python предоставляют удобный синтаксис для определения простых классов, хранящих данные, Pydantic предлагает более мощное и гибкое решение для проверки и анализа данных в приложениях Python. Класс BaseModel можно использовать для определения моделей данных и их правил проверки, он может проверять входные данные и анализировать их в объект Python, а также преобразовать их в JSON и другие форматы. Это делает Pydantic ценным инструментом для обеспечения целостности и согласованности данных в любом приложении Python, работающем с данными.

Примеры использования библиотеки Pydantic

Одним из основных преимуществ использования Pydantic является то, что она позволяет вам определять структуру ваших данных декларативным способом, используя аннотации типов Python. Это означает, что вы можете указать типы, значения по умолчанию и ограничения ваших данных непосредственно в коде, что упрощает его понимание и поддержку.

Например, вы хотите определить простую модель данных для пользователя с полями username, age, email и password. С Pydantic вы можете определить эту модель следующим образом:

from pydantic import BaseModel class User(BaseModel): username: str age: int email: str password: str

Каждое поле снабжено аннотацией типа, указывающей тип данных, которые оно может содержать. В этом случае имя пользователя, адрес электронной почты и пароль являются строками, а возраст — целым числом.

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

Вот пример того, как вы можете использовать некоторые из этих функций для дальнейшего определения модели User:

class User(BaseModel): username: str age: conint(gt=18) email: EmailStr password: constr(min_length=8, max_length=16) phone: Optional[str] = 'Unknown'

В этом примере мы использовали валидатор constr для определения ограничений для полей age и password. Мы указываем, что пароль должен состоять не менее чем из 8 символов. Поле age определено как тип conint с условием, что его значение должно быть больше 18 символов, а поле password определено как тип constr с двумя условиями: значение должно иметь длину не менее 8 символов и не более 16 символов . Мы также использовали тип EmailStr, чтобы указать, что поле email должно содержать действительный адрес электронной почты. Наконец, было добавлено поле phone, которое является необязательным и имеет значение по умолчанию «Неизвестно».

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

Чтобы создать собственный валидатор, вы можете определить функцию, которая принимает значение и выполняет все необходимые проверки. Если значение допустимо, функция должна вернуть его. Если значение недействительно, функция должна вызвать ValidationError с сообщением, объясняющим проблему.

Вот пример использования пользовательских валидаторов для модели User, аналогичный предыдущему примеру, и показывающий, как данные передаются в класс Pydantic для проверки и что такое выходные данные Pydantic.

import re from pydantic import BaseModel, validator class User(BaseModel): username: str age: int email: str password: str @validator("age") @classmethod def validate_age(cls, value): if value < 18: raise ValueError("User must be adult") return value @validator("email") @classmethod def validate_email(cls, value): if not bool(re.fullmatch(r'[\w.-]+@[\w-]+\.[\w.]+', value)): raise ValueError("Email is invalid") return value @validator("password") @classmethod def validate_password(cls, value): password_length = len(value) if password_length < 8 or password_length > 16: raise ValueError("The password must be between 8 and 16 characters long") return value # Valid User valid_user = { 'username': 'test_name', 'age': 20, 'email': '[email protected]', 'password': '123456789' } # Invalid User invalid_user = { 'username': 'test_name', 'age': 16, 'email': 'name_test.gr', 'password': '1234' } try: valid_result = User(**valid_user) print(valid_result) # Valid Output: username='test_name' age=20 email='[email protected]' password='123456789' invalid_result = User(**invalid_user) except ValueError as e: print(e.errors()) # Invalid Output: [ { "loc":"(""age",")", "msg":"User must be adult", "type":"value_error" }, { "loc":"(""email",")", "msg":"Email is invalid", "type":"value_error" }, { "loc":"(""password",")", "msg":"The password must be between 8 and 16 characters long", "type":"value_error" } ]

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

Pydantic и FastAPI

Pydantic — популярный выбор для определения моделей данных в FastAPI, высокопроизводительной веб-инфраструктуре Python для создания API. FastAPI построен на основе Starlette, облегчённой платформы ASGI, и легко интегрируется с Pydantic, обеспечивая быстрый и простой в использовании способ создания API.

Одним из основных преимуществ использования Pydantic с FastAPI является то, что он позволяет вам определять данные запроса и ответа вашего API простым и интуитивно понятным способом. Вы можете использовать модели данных Pydantic для определения структуры ваших данных запроса и ответа, а FastAPI будет автоматически проверять и преобразовывать данные в JSON и обратно по мере необходимости.

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

Давайте воспользуемся моделью User из предыдущего раздела, чтобы определить маршруты FastAPI для создания, обновления, получения и удаления User.

from fastapi import FastAPI app = FastAPI() @app.post("/users") def create_user(user: User): pass @app.get("/users/{username}") def get_user(username: str): pass @app.put("/users/{username}") def update_user(username: str, user: User): pass @app.delete("/users/{username}") def delete_user(username: str): pass

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

С помощью FastAPI и Pydantic вы можете быстро и легко создавать простые, интуитивно понятные API, с которыми легко работать. Независимо от того, создаёте ли вы небольшой API или крупномасштабное приложение, FastAPI и Pydantic помогут вам определить и проверить данные надёжным и эффективным способом.

Сравнение с другими библиотеками проверки данных

Есть несколько других библиотек Python, которые предоставляют функции, аналогичные Pydantic, такие как Marshmallow, Cerberus и Voluptuous. Вот некоторые из них:

Marshmallow— это библиотека для сериализации и проверки данных, она позволяет определять поля, проверки и другие сложные структуры данных, которые можно использовать в различных форматах.

Cerberus — еще одна библиотека для проверки данных в Python. Она имеет декларативный синтаксис, похожий на Marshmallow, но больше ориентированный на проверку данных, чем на сериализацию. Одним из преимуществ Cerberus является то, что он лёгкий и занимает меньше места, чем Pydantic или Marshmallow. Однако Pydantic предоставляет более широкий набор функций и в целом является более мощным.

Voluptuous— это Python-библиотека для проверки данных, похожая на Cerberus с точки зрения сосредоточенности на проверке данных. Она имеет декларативный синтаксис и лёгкость в использовании, но не предоставляет столько возможностей, как Pydantic или Marshmallow.

В целом, Pydantic — более многофункциональная библиотека по сравнению с Cerberus и Voluptuous, и она предлагает другой подход к проверке данных и сериализации по сравнению с Marshmallow. Вы можете сделать выбор в зависимости от конкретных потребностей вашего приложения.

Заключение

В Project Agora мы используем Pydantic в качестве предпочтительной библиотеки проверки данных для REST API из-за её простоты использования, гибкости и мощности. Благодаря простому и интуитивно понятному синтаксису Pydantic легко определять и проверять модели данных, гарантируя согласованность и точность данных, получаемых API. Кроме того, встроенные валидаторы и ограничения Pydantic, а также возможность создавать собственные валидаторы обеспечивают надежные средства определения и проверки данных. Это приводит к более надежным и безопасным API, которые могут уверенно обрабатывать данные.

Официальную документацию Pydantic можно найти здесь.

Статья была взята из следующего источника:

1
1 комментарий

"Поле age определено как тип conint с условием, что его значение должно быть больше 18 символов" вероятно ошибка

1
Ответить