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. Простота розширення. Додавання нових endpoint займає кілька рядків коду.

Навіщо це потрібно?

Уявіть, ви створюєте 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 та навчимося їх кастомізувати. Інструментальні барабани налаштовуються, чекаємо вас на наступному занятті!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ