В мире Django REST Framework маршрутизация отвечает за то, как запросы сопоставляются с обработчиками или представлениями. Когда мы используем View, маршруты определяются вручную с использованием path() или re_path() в файле urls.py. Но с появлением ViewSet ситуация становится сложнее: для одного ViewSet может понадобиться сразу несколько URL, соответствующих каждому из CRUD-методов (list, retrieve, create, update, delete). Ручная прописка всех этих маршрутов становится неблагодарной работой.
И тут появляются Routers. Это специальный механизм в DRF, который автоматически генерирует маршруты для ViewSet. Вам нужно только зарегистрировать ViewSet в Router, а остальное сделают магия DRF и гиперактивный маршрутогенератор.
Почему стоит использовать Routers?
- Меньше кода, меньше ошибок. Не нужно вручную прописывать маршруты, меньше шансов сделать опечатку.
- Стандартизация. Маршруты для API становятся унифицированными.
- Простота расширения. Добавление новых эндпоинтов занимает несколько строк кода.
Зачем это нужно?
Представьте, вы создаете API для управления задачами (ToDo). У вас есть модель Task, и вы хотите дать пользователям доступ:
- Список всех задач —
/tasks/(методlist). - Получить одну задачу по ID —
/tasks/{id}/(методretrieve). - Создать новую задачу —
/tasks/(методcreate). - Обновить задачу —
/tasks/{id}/(методыupdateилиpartial_update). - Удалить задачу —
/tasks/{id}/(методdestroy).
С View вы бы вручную прописывали маршруты для каждого из этих действий, а затем связывали их с соответствующими представлениями. С ViewSet и Router процесс упрощается: все маршруты генерируются автоматически.
Как подключить Router к проекту
Давайте разберем, как на практике настроить маршрутизацию с использованием Router.
Шаг 1: импортируем Router
DRF предоставляет два типа роутеров:
- SimpleRouter (более гибкий и простой).
- DefaultRouter (включает маршрут для корневой страницы API).
О них мы поговорим чуть позже, а пока давайте импортируем нужный инструмент:
from rest_framework.routers import SimpleRouter
Шаг 2: определяем ViewSet
Мы будем работать с моделью Task. Для начала создадим ViewSet:
from rest_framework.viewsets import ModelViewSet
from .models import Task
from .serializers import TaskSerializer
class TaskViewSet(ModelViewSet):
"""
ViewSet для управления задачами (Task).
"""
queryset = Task.objects.all()
serializer_class = TaskSerializer
Обратите внимание, что мы используем ModelViewSet, который автоматически реализует логику для CRUD-операций. Благодаря этому ViewSet поддерживает методы:
list(GET/tasks/)retrieve(GET/tasks/{id}/)create(POST/tasks/)update(PUT/tasks/{id}/)destroy(DELETE/tasks/{id}/)
Шаг 3: настраиваем маршрут с использованием Router
Теперь создадим Router и зарегистрируем наш ViewSet:
from rest_framework.routers import SimpleRouter
from .views import TaskViewSet
# Создаем экземпляр Router
router = SimpleRouter()
# Регистрируем ViewSet
router.register(r'tasks', TaskViewSet, basename='task')
# Подключаем маршруты Router в проекте
urlpatterns = router.urls
Что здесь произошло?
- Создан экземпляр
SimpleRouter. - Мы зарегистрировали наш
TaskViewSetпод маршрутомtasks. Это значит, что DRF автоматически создаст маршруты для всех действий, поддерживаемых ViewSet. - После регистрации доступны все маршруты для действий CRUD.
Шаг 4: проверяем маршруты
Для проверки откройте консоль и выполните команду:
python manage.py show_urls
Вы увидите результат вида:
Endpoint | Method | Action
--------------------------------------------------
/tasks/ | GET | list
/tasks/ | POST | create
/tasks/{id}/ | GET | retrieve
/tasks/{id}/ | PUT | update
/tasks/{id}/ | DELETE | destroy
Это и есть маршруты, сгенерированные автоматически благодаря Router.
Как подключить Router в основном urls.py
На практике обычно Routerы определяют в urls.py каждого приложения, а затем включают их в главный файл маршрутов проекта. Например:
В tasks/urls.py:
from rest_framework.routers import SimpleRouter
from .views import TaskViewSet
router = SimpleRouter()
router.register(r'tasks', TaskViewSet, basename='task')
urlpatterns = router.urls
В главном urls.py:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('tasks.urls')), # Подключаем маршруты приложения tasks
]
Теперь ваш API доступен по URL, начинающемуся с /api/tasks/.
Практическая работа: добавляем маршруты в проект
Давайте попробуем на практике настроить маршрутизацию для модели Category, которая связывается с задачами. Предположим, что у нас есть следующая модель:
# models.py
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
Создадим ViewSet и подключим его к маршрутизации.
# views.py
from rest_framework.viewsets import ModelViewSet
from .models import Category
from .serializers import CategorySerializer
class CategoryViewSet(ModelViewSet):
"""
ViewSet для управления категориями (Category).
"""
queryset = Category.objects.all()
serializer_class = CategorySerializer
Добавляем в Router
# urls.py
from rest_framework.routers import SimpleRouter
from .views import TaskViewSet, CategoryViewSet
router = SimpleRouter()
router.register(r'tasks', TaskViewSet, basename='task')
router.register(r'categories', CategoryViewSet, basename='category') # Новый маршрут
urlpatterns = router.urls
После этого автоматически сгенерируются маршруты для категорий:
/categories/ | GET | list
/categories/ | POST | create
/categories/{id}/ | GET | retrieve
/categories/{id}/ | PUT | update
/categories/{id}/ | DELETE | destroy
Типичные ошибки
Отсутствие параметра
basenameвregister(). Если не указатьbasename, DRF попытается автоматически вычислить его на основе модели. Это приводит к ошибкам, если у вашего ViewSet нет атрибутаqueryset.Дублирующиеся маршруты. Если случайно зарегистрировать несколько ViewSet с одинаковым базовым маршрутом (
tasks), это вызовет конфликт.Неправильная структура файлов. Убедитесь, что маршруты регистрируются в правильном
urls.pyи иерархия приложений организована корректно.
Заключительные слова (но не вывод)
В этой лекции мы научились использовать Router для автоматической генерации маршрутов в Django REST Framework. Это сильно упрощает работу, повышает читаемость кода и делает API более стандартизированным. В следующей лекции мы углубимся в сравнение SimpleRouter и DefaultRouter и научимся их кастомизировать. Инструментальные барабаны настраиваются, ждем вас на следующем занятии!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ