Django Ninja Aio: асинхронный CRUD на максимальной скорости.

Django Ninja AIO (а именно Django Ninja AIO CRUD) — это легковесный фреймворк с поддержкой асинхронности, предназначенный для упрощения разработки REST API на базе Django.
Django Ninja AIO (а именно Django Ninja AIO CRUD) — это легковесный фреймворк с поддержкой асинхронности, предназначенный для упрощения разработки REST API на базе Django.

Привет, друзья! Помните мою прошлую статью о Django Ninja, который ускоряет разработку? Так вот, у него появился «младший брат» — Django Ninja Aio. И этот брат работает на стероидах асинхронности.

Представьте: вам нужно создать API для интернет-магазина. Тысячи товаров, пользователей, заказов. Классический Django, даже с Ninja, может начать спотыкаться на одновременных запросах. Django Ninja Aio решает эту проблему, принося в знакомый мир Ninja всю мощь async/await. Это не просто обёртка — это переосмысление подхода к созданию API.

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

CRUD в мире асинхронности: что изменилось?

CRUD (Create, Read, Update, Delete) — это основа практически любого API. В стандартном Django Ninja вы создаёте операции, которые работают синхронно. Запрос пришёл — обработка — ответ ушёл. Всё четко, но если операция тяжелая (запрос в базу, вызов внешнего API), другие запросы ждут своей очереди.

Django Ninja Aio меняет правила игры. Он позволяет объявлять CRUD-операции как асинхронные функции. Это значит, что пока одна операция ждёт ответа от базы данных, сервер может обрабатывать другие запросы. Пропускная способность вашего API вырастает в разы, особенно для операций с вводом-выводом (I/O-bound).

Версия 2.7.0 (на которую ведёт документация) делает этот процесс удивительно простым. Основатель проекта, Виталий Коваль (известный также как создатель оригинального Django Ninja), сохранил философию «максимум выразительности при минимуме кода», но перенёс её в асинхронный контекст.

Как это работает под капотом: магия async def

А теперь самое интересное — техническая часть. Django Ninja Aio построен на базе Starlette (как и FastAPI), что обеспечивает нативную поддержку асинхронности. Когда вы создаёте операцию с async def, происходит следующее:

  1. Маршрутизация: Фреймворк использует ту же систему маршрутизации, что и Ninja, но адаптированную для работы с асинхронными функциями.
  2. Валидация: Валидация данных с помощью Pydantic также происходит асинхронно, что ускоряет обработку сложных схем.
  3. Работа с ORM: Вот ключевой момент! Для асинхронных запросов к базе данных вам понадобится Django 4.1+ с поддержкой async ORM или библиотеки вроде databases и ormar.

Посмотрите на разницу. Обычный Ninja-эндпоинт для получения списка товаров:

@api.get("/products") def list_products(request): return Product.objects.all() # Синхронный запрос, блокирует поток Тот же эндпоинт в Ninja Aio: python @api.get("/products") async def list_products(request): return await Product.objects.all() # Асинхронный запрос, поток свободен

Кажется, изменилось немного — всего одно async/await. Но под капотом это совершенно другая модель выполнения, которая использует event loop для эффективного управления множеством операций ввода-вывода.

Реальная практика: создаём асинхронный CRUD за 5 минут

Давайте создадим полноценный асинхронный CRUD для модели Article. Это покажет, насколько элегантен этот фреймворк.

Сначала установим все необходимое:

pip install django-ninja-aio django

Теперь создадим наше асинхронное API:

# api.py from django_ninja_aio import NinjaAPI from .models import Article from .schemas import ArticleIn, ArticleOut api = NinjaAPI() @api.post("/articles/", response=ArticleOut) async def create_article(request, data: ArticleIn): article = await Article.objects.acreate(**data.dict()) return article @api.get("/articles/", response=list[ArticleOut]) async def list_articles(request): return await Article.objects.all() @api.get("/articles/{article_id}/", response=ArticleOut) async def get_article(request, article_id: int): return await Article.objects.aget(id=article_id) @api.put("/articles/{article_id}/", response=ArticleOut) async def update_article(request, article_id: int, data: ArticleIn): article = await Article.objects.aget(id=article_id) for attr, value in data.dict().items(): setattr(article, attr, value) await article.asave() return article @api.delete("/articles/{article_id}/") async def delete_article(request, article_id: int): article = await Article.objects.aget(id=article_id) await article.adelete() return {"success": True}

Красота в том, что это почти тот же код, что и в классическом Ninja! Разница лишь в async/await и использовании асинхронных методов ORM (acreate, aget, asave).

Сравнение с конкурентами: почему Ninja Aio?

На рынке асинхронных Python-фреймворков есть несколько заметных игроков. Давайте посмотрим, как Ninja Aio выглядит на их фоне:

Django Ninja Aio: асинхронный CRUD на максимальной скорости.

Главное преимущество Ninja Aio — это миграционный путь. Если вы уже используете Django Ninja, переход на асинхронную версию займёт считанные часы. Вам не нужно переучиваться — нужно лишь добавить async/await в нужных местах.

Когда использовать (а когда нет): честно об ограничениях

Django Ninja Aio — отличный инструмент, но он не серебряная пуля. Вот его сильные и слабые стороны:

✅ Идеальные сценарии:

  • API с высоким уровнем одновременных запросов
  • Микросервисы, которые часто обращаются к внешним API
  • Приложения, где важна отзывчивость при операциях с базой данных
  • Проекты, которые уже используют Django Ninja и нужно повысить производительность

❌ Когда лучше выбрать другое решение:

  • У вас много CPU-bound операций (тяжёлые вычисления). Асинхронность тут не поможет
  • Проект на Django 3.x или ниже (нет нативной async-поддержки в ORM)
  • Ваша команда совсем не знает асинхронного программирования
  • Нужна максимальная зрелость и стабильность (FastAPI пока более зрелый)

Важный нюанс: асинхронность в Django ORM всё ещё развивается. Не все функции имеют async-аналоги. Перед выбором Ninja Aio проверьте, поддерживает ли async ваша версия Django нужные вам запросы.

Что дальше: будущее асинхронного Django

Django Ninja Aio — часть большой тенденции. Сообщество Django активно движется в сторону асинхронности:

  1. Django 5.0 обещает расширенную async-поддержку в ORM
  2. Django Ninja продолжает развивать синхронную версию, но с оглядкой на асинхронность
  3. FastAPI остаётся главным конкурентом, что стимулирует развитие обоих фреймворков

Мой прогноз: в течение 1-2 лет мы увидим сближение синтаксиса и возможностей Django Ninja и Django Ninja Aio. Возможно, появится единый фреймворк, который будет автоматически определять, какую версию операции использовать.

Уже сейчас большие проекты начинают присматриваться к Ninja Aio для критически важных API. Интеграция с Django Channels для WebSocket — следующая логичная ступень, которая может сделать этот фреймворк универсальным решением для всех видов Django-API.

Начните с малого: практический совет

Если вы хотите попробовать Django Ninja Aio, начните с миграции одного модуля API — например, модуля уведомлений или аналитики. Так вы почувствуете разницу, не переписывая весь проект.

Django Ninja Aio: асинхронный CRUD на максимальной скорости.

Установите фреймворк, создайте несколько async-эндпоинтов и протестируйте их под нагрузкой. Вы сразу увидите, стоит ли переходить на асинхронность во всём проекте.

Документация версии 2.7.0 — отличная отправная точка. Там есть все необходимые примеры и объяснения:

🙌 Если статья была полезной — подписывайся, дальше будет ещё интереснее. Буду рад лайку и комментарию — это помогает продвигать материалы и подсказывает, что разбирать дальше.

Пиши в комментариях, сталкивался ли ты с Django Ninja Aio на практике? Планируешь ли использовать асинхронные возможности в своих Django-проектах? Интересно узнать твой опыт!

Начать дискуссию