Django REST Framework: API на Django
Современный бэкенд часто отдаёт не HTML, а JSON для мобильных приложений и фронтенд-фреймворков. Django REST Framework превращает Django в мощный конструктор API.
Суть: DRF добавляет сериализаторы (модель ↔ JSON), ViewSets (CRUD одним классом) и роутеры (автогенерация URL). Это стандарт де-факто для REST API на Django.
Зачем отдельный фреймворк для API
Django отлично рендерит HTML, но современные приложения часто строятся иначе: бэкенд отдаёт данные в JSON, а отрисовкой занимается мобильное приложение или фронтенд на React/Vue. Для этого нужен слой, который аккуратно превращает модели в JSON и обратно, валидирует данные и строит REST-эндпоинты. Django REST Framework (DRF) — самый популярный такой инструмент.
Сериализаторы: модель ↔ JSON
Сердце DRF — сериализатор. Он переводит объекты Django в JSON (сериализация) и разбирает входящий JSON обратно в объекты с валидацией (десериализация). ModelSerializer строится из модели почти как ModelForm:
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ["id", "title", "body", "created_at"]
ViewSets и роутеры
ModelViewSet даёт весь CRUD (список, деталь, создание, обновление, удаление) одним классом. А роутер автоматически строит для него все URL — не нужно вручную писать пути:
from rest_framework import viewsets, routers
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
router = routers.DefaultRouter()
router.register("posts", PostViewSet)
# даёт: GET/POST /posts/, GET/PUT/DELETE /posts/{id}/
Связь компонентов:
HTTP JSON-запрос
│
▼
Router ── строит URL для ViewSet
│
▼
ViewSet ── выбирает действие: list/retrieve/create/update/destroy
│
▼
Serializer ── модель ↔ JSON, валидация
│
▼
Model/ORM ── база данных
│
▼
JSON-ответ
Как это работает под капотом
Сериализация — это маппинг объекта в словарь по списку полей, а десериализация — обратный разбор с проверкой. Языко-независимая логика, которую видно на чистом Python:
# Попробуй сам ▶ — сериализация и десериализация как в DRF
import json
fields = ["id", "title", "body"] # Meta.fields
def serialize(obj): # объект → JSON
return json.dumps({f: obj[f] for f in fields}, ensure_ascii=False)
def deserialize(raw): # JSON → объект + валидация
data = json.loads(raw)
errors = {}
for f in fields:
if f == "id":
continue
if not data.get(f):
errors[f] = "обязательное поле"
if errors:
return None, errors
return {f: data.get(f) for f in fields}, {}
post = {"id": 1, "title": "Django REST", "body": "Учим DRF"}
print("serialize:", serialize(post))
obj, err = deserialize('{"title": "Новый", "body": "текст"}')
print("deserialize ok:", obj, err)
obj2, err2 = deserialize('{"title": ""}')
print("deserialize bad:", obj2, err2)
DRF делает это полнее (типы полей, вложенные связи, права доступа), но суть — маппинг между объектом и JSON с валидацией на входе.
Права и аутентификация
API нужно защищать. DRF даёт классы прав (IsAuthenticated, IsAdminUser) и схемы аутентификации (токены, сессии, JWT через сторонние пакеты). Их указывают на ViewSet или глобально в настройках.
Async в современном Django
Отдельно упомянем актуальный тренд. Начиная с Django 4.1–5.2, ORM получил асинхронные методы (afilter, aget, acreate), а Django 5.2 добавил async-методы аутентификации. Под ASGI можно писать полностью асинхронные views для задач с большим вводом-выводом. Это не замена синхронному коду, а инструмент для специфичных нагрузок.
Частые ошибки
- Писать API «вручную» через JsonResponse для всего. На объёме DRF экономит много кода и даёт валидацию.
- Забыть указать права доступа. API окажется открытым всем.
- Возвращать модель напрямую без сериализатора. Утечёт лишнее, не будет валидации.
- Игнорировать пагинацию. Эндпоинт списка вернёт миллион записей одним ответом.
Best practices
- Для REST API используйте DRF, а не самописные JSON-эндпоинты.
- Перечисляйте поля сериализатора явно, не отдавайте всё подряд.
- Настраивайте права доступа и пагинацию с самого начала.
- Async применяйте точечно — там, где много ожидания ввода-вывода.
Итоги
Django REST Framework превращает Django в конструктор API: сериализаторы переводят модели в JSON и валидируют ввод, ViewSets дают CRUD одним классом, роутеры строят URL. Защищайте API правами и пагинацией. А async-возможности современного Django открывают дверь к высоконагруженным сценариям. На этом ваш путь по Django заложен — дальше только практика.