JavaRush /Курсы /Модуль 3: Django /Настройка маршрутизации с использованием Routers

Настройка маршрутизации с использованием Routers

Модуль 3: Django
20 уровень , 5 лекция
Открыта

В мире 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?

  1. Меньше кода, меньше ошибок. Не нужно вручную прописывать маршруты, меньше шансов сделать опечатку.
  2. Стандартизация. Маршруты для API становятся унифицированными.
  3. Простота расширения. Добавление новых эндпоинтов занимает несколько строк кода.

Зачем это нужно?

Представьте, вы создаете 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

Что здесь произошло?

  1. Создан экземпляр SimpleRouter.
  2. Мы зарегистрировали наш TaskViewSet под маршрутом tasks. Это значит, что DRF автоматически создаст маршруты для всех действий, поддерживаемых ViewSet.
  3. После регистрации доступны все маршруты для действий 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

Типичные ошибки

  1. Отсутствие параметра basename в register(). Если не указать basename, DRF попытается автоматически вычислить его на основе модели. Это приводит к ошибкам, если у вашего ViewSet нет атрибута queryset.

  2. Дублирующиеся маршруты. Если случайно зарегистрировать несколько ViewSet с одинаковым базовым маршрутом (tasks), это вызовет конфликт.

  3. Неправильная структура файлов. Убедитесь, что маршруты регистрируются в правильном urls.py и иерархия приложений организована корректно.

Заключительные слова (но не вывод)

В этой лекции мы научились использовать Router для автоматической генерации маршрутов в Django REST Framework. Это сильно упрощает работу, повышает читаемость кода и делает API более стандартизированным. В следующей лекции мы углубимся в сравнение SimpleRouter и DefaultRouter и научимся их кастомизировать. Инструментальные барабаны настраиваются, ждем вас на следующем занятии!

1
Задача
Модуль 3: Django, 20 уровень, 5 лекция
Недоступна
Простая маршрутизация с DefaultRouter
Простая маршрутизация с DefaultRouter
1
Задача
Модуль 3: Django, 20 уровень, 5 лекция
Недоступна
Маршрутизация для нескольких ViewSet с SimpleRouter
Маршрутизация для нескольких ViewSet с SimpleRouter
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ