JavaRush /Курси /Модуль 3: Django /Маршрутизація на рівні додатка

Маршрутизація на рівні додатка

Модуль 3: Django
Рівень 6 , Лекція 3
Відкрита

Сьогодні ми зануримось у процес створення маршрутів всередині окремих додатків і дізнаємось, як правильно організувати URL-адреси

для більш масштабованого та модульного проєкту.

Навіщо потрібна маршрутизація на рівні додатків?

Маршрутизація в Django — це як дорожні вказівники для вашого вебсайту. Коли користувач вводить адресу "/blog/" у браузері, Django має зрозуміти, куди його направити і що показати.

Уявіть, що у вас великий проєкт, як ціле місто з багатьма районами (додатками) і вулицями (URL-адресами). Було б незручно зберігати мапу всього міста в одному місці, правда? Якщо всі маршрути запхати в один файл urls.py на рівні проєкту, він перетвориться на величезну заплутану схему.

Ось тут і приходить на допомогу маршрутизація на рівні додатків! Вона дозволяє кожному додатку самостійно управляти своїми маршрутами. Це як якщо б ви сказали: "Гей, додаток для блогу, ти сам відповідаєш за свої сторінки, а додаток для магазину — за свої". Так усе стає набагато організованішим і простішим для розуміння, особливо коли проєкт росте.

Переваги

  • Модульність: кожен додаток відповідає за свої маршрути.
  • Чистота коду: головний файл urls.py залишається акуратним і простим.
  • Повторне використання: ви можете взяти додаток, включаючи його маршрути, і використовувати його в іншому проєкті без особливих змін.

Файл urls.py всередині додатка

Файл urls.py у додатку служить для визначення маршрутів, специфічних для цього додатка. Це як "локальний диспетчер" URL-адрес лише для цієї частини проєкту. Зазвичай він створюється вручну, оскільки Django не створює його автоматично при виконанні команди startapp.

Давайте створимо файл urls.py у нашому додатку "Блог". Перейдіть у папку вашого додатка (наприклад, blog) і створіть там файл urls.py.

myproject/
├── manage.py
├── myproject/
│   ├── settings.py
│   ├── urls.py  <-- Головний маршрутизатор
│   └── ...
├── blog/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── views.py
│   ├── urls.py  <-- Локальний маршрутизатор додатка
│   └── ...

Зміст файлу urls.py

Ось мінімальна структура файлу urls.py. Тут ми починаємо з імпорту маршрутизатора і зв'язуємо URL з представленнями:

# blog/urls.py
from django.urls import path
from . import views  # Імпортуємо наші представлення

urlpatterns = [
    path('', views.index, name='blog_index'),  # Головна сторінка блогу
    path('post/<int:post_id>/', views.post_detail, name='post_detail'),  # Детальна сторінка поста
]

Тут:

  • Ми прив'язуємо URL-адреси до функцій представлення у views.py.
  • Використовуємо name для іменування маршрутів. Це корисно для зворотного побудування URL (ми до цього ще повернемося).

Підключення маршрутів додатка в проєкт

Тепер нам потрібно підключити маршрути додатка "Блог" до головного маршрутизатора проєкту (urls.py на рівні проєкту).

Відкрийте файл myproject/urls.py і підключіть ваш файл urls.py, використовуючи функцію include():

# myproject/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),  # Панель адміністратора
    path('blog/', include('blog.urls')),  # Підключаємо маршрути "Блогу"
]

Тут:

  • Коли користувач вводить у адресному рядку /blog/, Django буде шукати маршрути у файлі blog/urls.py.
  • Ми використовуємо include() для підключення маршрутів із додатків.

Перевірка підключених маршрутів

Запустіть сервер:

python manage.py runserver

Тепер перейдіть за адресою:

Динамічні параметри маршрутів

Динамічні параметри дозволяють передавати змінні через URL-адреси. Наприклад, у маршруті /post/<int:post_id>/ ми використовуємо <int:post_id> для отримання ідентифікатора поста.

Наводимо приклад. Оновимо наш маршрут і представлення для відображення поста:

Оновлення маршруту

# blog/urls.py
urlpatterns = [
    path('', views.index, name='blog_index'),
    path('post/<int:post_id>/', views.post_detail, name='post_detail'),  # Тепер із динамічним параметром
]

Оновлення представлення

У файлі views.py додамо функцію post_detail, яка приймає post_id:

# blog/views.py
from django.http import HttpResponse

def index(request):
    return HttpResponse("Це головна сторінка блогу.")

def post_detail(request, post_id):
    return HttpResponse(f"Ви читаєте пост з ID: {post_id}")

Перейдіть за адресою http://127.0.0.1:8000/blog/post/2/ і переконайтеся, що параметр post_id обробляється.

Розділення маршрутів за застосунками

Коли у вас багато застосунків, кожен із яких відповідає за свої маршрути, ви можете легко підтримувати проєкт і додавати нові функції, не боячись, що зміни в одному місці зламають усе інше.

Припустимо, у вас є два застосунки: "Блог" і "Магазин". Для кожного з них створіть свій файл urls.py і підключіть їх у головному маршрутизаторі проєкту (myproject/urls.py):

# myproject/urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),
    path('shop/', include('shop.urls')),  # Підключаємо маршрути магазину
]

Тепер /blog/ відповідає за блог, а /shop/ — за магазин. Прямо як два різних відділи в компанії.

Типові помилки та їх вирішення

  1. Файл urls.py не знайдено: можлива причина — ти забув створити файл у папці застосунку. Переконайся, що файл urls.py присутній.
  2. Імпорт include не виконано: якщо ти забув імпортувати функцію include у myproject/urls.py, то отримаєш помилку. Додай її: from django.urls import include.
  3. Дублюючі маршрути: якщо у головному файлі urls.py проєкту є маршрут, який збігається з маршрутом застосунку, це може викликати конфлікти. Переконайся, що маршрути унікальні.

Практичне завдання

Створіть додаток "Блог", у якому:

  1. Є файл urls.py з маршрутом для головної сторінки блогу та сторінки детального перегляду поста.
  2. У головному маршрутизаторі проєкту додано підключення маршрутів додатка.
  3. Реалізовані динамічні параметри в маршрутах.

Перевірте, що все працює, і поділіться своїми успіхами!

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