• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Использование Pydantic в веб-разработке: Зачем и Как

HooliMe

HDD-drive
Пользователь
Регистрация
22.08.2024
Сообщения
21
Реакции
4

Введение.

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

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

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

Pydantic — простота использования и легкая интеграция с популярными фреймворками, такими как FastAPI и Django.



Зачем использовать Pydantic?

Автоматическая валидация данных: Ошибки данных выявляются на раннем этапе, что снижает риск возникновения багов.
Типизация и конвертация данных: Pydantic автоматически конвертирует данные в нужные типы (например, строки в числа или даты).
Простота и чистота кода: Код становится более читаемым и поддерживаемым за счет устранения необходимости ручной валидации.

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

Рассмотрим простой проект управления закладками (не теме которые вы могли подумать).

Без Pydantic:
Python:
from fastapi import FastAPI, HTTPException

app = FastAPI()

pins = {}

@app.post("/pins/")
def create_pin(pin_id: int, url: str, description: str):
    if not isinstance(pin_id, int) or not isinstance(url, str) or not isinstance(description, str):
        raise HTTPException(status_code = 400, detail = "Invalid input")
    
    if pin_id in pins:
        raise HTTPException(status_code = 400, detail = "Pin ID already exists")
    
    pins[pin_id] = {"url": url, "description": description}
    return pins[pin_id]

Проблемы без Pydantic:

Необходимость ручной валидации данных.
Сложность поддержки и избыточность кода.
Повышенный риск ошибок при добавлении новых параметров.


С использованием Pydantic:
Python:
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl

app = FastAPI()

pins = {}

class Pin(BaseModel):
    pin_id: int
    url: HttpUrl
    description: str

@app.post("/pins/")
def create_pin(pin: Pin):
    if pin.pin_id in pins:
        raise HTTPException(status_code = 400, detail = "Pin ID already exists")
    
    pins[pin.pin_id] = pin.dict()
    return pins[pin.pin_id]

Преимущества с Pydantic:

Упрощение кода за счет автоматической валидации данных.
Гарантированная типизация и конвертация данных.
Более структурированный и поддерживаемый код.



Заключение

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






Впервые пишу тему, пострался максимально просто описать всё, не знаю на сколько всё это вышло, если остались вопросы, то буду рад ответить в комментариях.
 
Не знаю, может я какой то старпёр, но мне как то более приятней работать с isinstance, raise и assert, чем с такой либой. Мне кажется пример её использования немного не подходит что бы показать чем она упрощает жизнь. То что меньше кода - да, код легче понять - нет. Можно же по идее самому создать такой класс и точно так же проводить валидацию, единственно придётся добавить пару строк что бы передавалась не только переменная но и её тип, но за то это избавит код от сторонних библиотек, ведь сторонние библиотеки это не всегда хорошо, это + баги, уязвимости, ошибки при обновлении версий ( либы или пайтона ), тут не угадаешь.
 
Можно же по идее самому создать такой класс и
В результате получить свой pydantic, поиском ошибок в котором ты занимался сам, в отличии от pydantic в который багрепортили сотни людей.
тут не угадаешь.
Тут не надо угадывать, тут надо учиться. Можешь например делать свою библиотеку адаптер если думаешь что от условного pydantic в будущем придется отказатся.
 
Не знаю, может я какой то старпёр, но мне как то более приятней работать с isinstance, raise и assert, чем с такой либой. Мне кажется пример её использования немного не подходит что бы показать чем она упрощает жизнь. То что меньше кода - да, код легче понять - нет. Можно же по идее самому создать такой класс и точно так же проводить валидацию, единственно придётся добавить пару строк что бы передавалась не только переменная но и её тип, но за то это избавит код от сторонних библиотек, ведь сторонние библиотеки это не всегда хорошо, это + баги, уязвимости, ошибки при обновлении версий ( либы или пайтона ), тут не угадаешь.


Привет, работай с инструментами, которые ты хорошо знаешь. Но позволь пояснить, почему всё же стоит использовать Pydantic.
  1. Цель Pydantic не просто сократить количество кода, а сделать его более декларативным и менее подверженным ошибкам и прочим ошибкам. Да, можно написать собственные классы для валидации, но Pydantic делает это за тебя, и делает это очень эффективно.
  2. Насчёт сторонних библиотек: Любая внешняя библиотека может принести с собой баги или уязвимости. Однако Pydantic — это широко используемый инструмент с активным сообществом и частыми обновлениями. Риски минимизируются за счёт того, что библиотека проходит через многие этапы тестирования и использует стандартные механизмы Python.
  3. С точки зрения поддержки и читаемости кода: Когда команда разрабатывает сложное приложение, согласование и стандартизация валидации данных становятся критически важными. Pydantic предоставляет единую и понятную структуру, которую легко понять большинству кодеров, это особенно важно в команде, где код пишется и поддерживается многими людьми.
  4. Поддержка и обновления: В случае изменений в Python, такие библиотеки как Pydantic адаптируются быстрее (из-за активного сообщества), чем собственноручно написанные решения.
 
В результате получить свой pydantic, поиском ошибок в котором ты занимался сам, в отличии от pydantic в который багрепортили сотни людей.

Тут не надо угадывать, тут надо учиться. Можешь например делать свою библиотеку адаптер если думаешь что от условного pydantic в будущем придется отказатся.
Я имел ввиду, что можно так же объединять в классы и так же настроить валидацию типа данных не используя сторонние библиотеки. Я ничего не писал про разработку своего модуля, зачем он нужен если это пару строк кода.
 
Привет, работай с инструментами, которые ты хорошо знаешь. Но позволь пояснить, почему всё же стоит использовать Pydantic.
  1. Цель Pydantic не просто сократить количество кода, а сделать его более декларативным и менее подверженным ошибкам и прочим ошибкам. Да, можно написать собственные классы для валидации, но Pydantic делает это за тебя, и делает это очень эффективно.
  2. Насчёт сторонних библиотек: Любая внешняя библиотека может принести с собой баги или уязвимости. Однако Pydantic — это широко используемый инструмент с активным сообществом и частыми обновлениями. Риски минимизируются за счёт того, что библиотека проходит через многие этапы тестирования и использует стандартные механизмы Python.
  3. С точки зрения поддержки и читаемости кода: Когда команда разрабатывает сложное приложение, согласование и стандартизация валидации данных становятся критически важными. Pydantic предоставляет единую и понятную структуру, которую легко понять большинству кодеров, это особенно важно в команде, где код пишется и поддерживается многими людьми.
  4. Поддержка и обновления: В случае изменений в Python, такие библиотеки как Pydantic адаптируются быстрее (из-за активного сообщества), чем собственноручно написанные решения.
Я понимаю с какой целью используют этот модуль, просто мне кажется его функционал не ограничивается только тем что ты показал в примере. И тут у меня назрел как раз вывод что его следует использовать когда он действительно необходим для декларирования, а просто так его использовать мне кажется не смысла. Но за объснение спасибо, модуль полезный по факту ( но опять же повторюсь когда он действительно необходим коду ).
 
В результате получить свой pydantic, поиском ошибок в котором ты занимался сам, в отличии от pydantic в который багрепортили сотни людей.

Тут не надо угадывать, тут надо учиться. Можешь например делать свою библиотеку адаптер если думаешь что от условного pydantic в будущем придется отказатся.
По поводу багрепорты: даже у таких инструментов, библиотек и прочего ПО опенсорс с большим комьюнити имеются какие никакие баги или уязвимости. Тут стоит отталкиваться от необходимости использования сторонних модулей, а не от популярности и количества человек которые им пользуются и делают эти багрепорты.
 
Я имел ввиду, что можно так же объединять в классы и так же настроить валидацию типа данных не используя сторонние библиотеки. Я ничего не писал про разработку своего модуля, зачем он нужен если это пару строк кода.
Ты постепенно придешь к тому что начнешь таскать эти пары строк в разные проекты, а потом и сделаешь свой модуль. Это здравая позиция избегать зависимостей. Я прекрасно понимаю что тебе не хочется множить вероятные проблемы. Учись одновременно и избегать зависимостей и не тратить время на изобретение великов. Используй адаптеры, тогда твой код будет зависеть от твоих адаптеров а адапреты уже от всяких pydentic, избавляясь когда это реально надо от зависимости в адаптере ты во всех своих проектах избавляешся от условного pydentic.
 
Ты постепенно придешь к тому что начнешь таскать эти пары строк в разные проекты, а потом и сделаешь свой модуль. Это здравая позиция избегать зависимостей. Я прекрасно понимаю что тебе не хочется множить вероятные проблемы. Учись одновременно и избегать зависимостей и не тратить время на изобретение великов. Используй адаптеры, тогда твой код будет зависеть от твоих адаптеров а адапреты уже от всяких pydentic, избавляясь когда это реально надо от зависимости в адаптере ты во всех своих проектах избавляешся от условного pydentic.
Вот мы и поняли друг друга, велик конечно не хочется изобретать :)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх