Сьогодні ми зануримось у процес створення маршрутів всередині окремих додатків і дізнаємось, як правильно організувати 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
Тепер перейдіть за адресою:
- http://127.0.0.1:8000/blog/ — має відобразитися представлення
index. - http://127.0.0.1:8000/blog/post/1/ — тут відобразиться сторінка для поста з ідентифікатором
1.
Динамічні параметри маршрутів
Динамічні параметри дозволяють передавати змінні через 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/ — за магазин. Прямо як два різних відділи в компанії.
Типові помилки та їх вирішення
- Файл
urls.pyне знайдено: можлива причина — ти забув створити файл у папці застосунку. Переконайся, що файлurls.pyприсутній. - Імпорт
includeне виконано: якщо ти забув імпортувати функціюincludeуmyproject/urls.py, то отримаєш помилку. Додай її:from django.urls import include. - Дублюючі маршрути: якщо у головному файлі
urls.pyпроєкту є маршрут, який збігається з маршрутом застосунку, це може викликати конфлікти. Переконайся, що маршрути унікальні.
Практичне завдання
Створіть додаток "Блог", у якому:
- Є файл
urls.pyз маршрутом для головної сторінки блогу та сторінки детального перегляду поста. - У головному маршрутизаторі проєкту додано підключення маршрутів додатка.
- Реалізовані динамічні параметри в маршрутах.
Перевірте, що все працює, і поділіться своїми успіхами!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ