Короткий зміст попередніх лекцій
До цього моменту ви познайомилися з основами роботи з представленнями (views) у Django. Ми обговорили, що таке представлення, їх роль в обробці HTTP-запитів і відмінності між функціональними (FBV) і класовими представленнями (CBV). Ви навчилися створювати прості функції представлень, повертати текстові або HTML-відповіді, а також обробляти помилки за допомогою HTTP-статус-кодів.
Ми плавно підійшли до важливої частини роботи будь-якого веб-додатку — маршрутизації. До сьогоднішнього дня ви дізналися, що таке URLConf і як він допомагає зв'язувати запити з відповідними обробниками (представленнями). Тепер ми заглибимося в процес зв'язування URL-адрес з нашими представленнями.
Чому це важливо?
Коли користувач вашої веб-сторінки натискає на посилання або вводить URL у браузері, Django має зрозуміти, яке представлення йому потрібно викликати, щоб обробити запит. Процес маршрутизації допомагає "перекласти" URL у конкретну функцію або клас, який обробить запит. Це як поштова служба: URL — це адреса, а представлення — це поштовий ящик, куди доставляють лист (запит).
Основи зв'язування URL з представленнями
У Django маршрути конфігуруються через файл urls.py. Існує головний файл маршрутів, зазвичай розташований у корені проєкту, і окремі файли urls.py у додатках, які додають свої маршрути. Наше завдання — співставити кожну URL-адресу з певним представленням.
Приблизний процес:
- Задаємо шаблон URL.
- Прив'язуємо шаблон до функції або класу представлення.
- Визначаємо всі маршрути у
urlpatterns.
Приклад головного файлу маршрутів project/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"
]
Приклад файлу маршрутів для додатка blog/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'), # Головна сторінка
path('about/', views.about, name='about'), # Сторінка "Про нас"
]
Простий приклад маршруту
Якщо ви хочете, щоб URL /hello/ відображав повідомлення "Привіт, світе!", структура буде виглядати так:
- Створюємо представлення.
- Задаємо маршрут для URL.
Код у views.py:
from django.http import HttpResponse
def hello_world(request):
return HttpResponse("Привіт, світе!")
Код у urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('hello/', views.hello_world, name='hello_world'),
]
Тепер, якщо ви відкриєте у браузері http://127.0.0.1:8000/hello/, ви побачите привітання.
Використання функції path()
Основний синтаксис
Функція path() — це основний інструмент для маршрутизації запитів у Django. Її синтаксис:
path(route, view, kwargs=None, name=None)
route— рядок, який описує шаблон URL.view— посилання на функцію або клас представлення.kwargs— додаткові параметри, які можна передати в представлення (рідше використовується).name— ім'я маршруту. Воно дозволяє посилатися на маршрут через шаблони або зворотній виклик.
Приклад:
path('home/', views.homepage, name='homepage')
Призначення імен маршрутам
Імена маршрутів — це потужний інструмент, що дозволяє посилатися на URL-и у шаблонах і коді без жорсткого зазначення рядків. Це зручно, бо якщо ви зміните URL, вам не доведеться оновлювати шаблони чи інші частини коду.
Шаблонний приклад в HTML:
<a href="{% url 'homepage' %}">Головна сторінка</a>
Якщо пізніше маршрут буде переписаний на:
path('start/', views.homepage, name='homepage')
Посилання у шаблоні автоматично оновиться.
Приклади зв’язаних маршрутів
Обробка запитів GET і POST
До цього ми використовували тільки метод GET, але Django дозволяє обробляти й інші HTTP-методи, такі як POST. Ось приклад:
Код у views.py:
from django.http import HttpResponse
def my_view(request):
if request.method == 'GET':
return HttpResponse("Це GET-запит.")
elif request.method == 'POST':
return HttpResponse("Це POST-запит.")
else:
return HttpResponse("Метод не підтримується.")
Код у urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('example/', views.my_view, name='example'),
]
Тепер, якщо відправити запит GET на /example/, ви отримаєте "Це GET-запит". Якщо відправити POST, результат зміниться на "Це POST-запит".
Динамічні маршрути
Іноді потрібно приймати параметри з URL і використовувати їх у представленнях. Наприклад, якщо ви хочете відображати профіль користувача за його ID.
Код маршруту зі змінною:
path('profile/<int:user_id>/', views.user_profile, name='user_profile')
Код у представленні views.py:
from django.http import HttpResponse
def user_profile(request, user_id):
return HttpResponse(f"Профіль користувача з ID: {user_id}")
Якщо ви відкриєте /profile/42/, ви побачите: "Профіль користувача з ID: 42".
Типи змінних:
<int:var>— Тільки цілочисельні значення.<str:var>— Будь-який рядок.<slug:var>— URL-friendly рядок (літери, цифри, дефіси).<uuid:var>— UUID.<path:var>— Рядок, що включає/.
Робота з urls.py у додатках
Як вже обговорювалося, кожному додатку в Django відповідає власний файл urls.py. Це дозволяє модульно проєктувати маршрути.
- У
project/urls.pyпідключаємо маршрути додатку:from django.urls import path, include urlpatterns = [ path('blog/', include('blog.urls')), ]
- У
blog/urls.pyвизначаємо маршрути:from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('<int:post_id>/', views.detail, name='detail'), ]
Тепер:
http://127.0.0.1:8000/blog/викличеviews.index.http://127.0.0.1:8000/blog/42/викличеviews.detail(42).
Проблеми та типові помилки
Плутанина в синтаксисі
Одна з найпоширеніших помилок — забути додати слеш в кінці URL, наприклад, path('hello', views.hello_view) замість path('hello/', views.hello_view). Django строгий до цих синтаксичних деталей. Переконайтеся, що ваші URL завершені правильним синтаксисом.
Погана організація маршрутів
Якщо у вас зростає кількість маршрутів, не забудьте модулювати їх через include(). Наприклад, тримати маршрути додатків в окремих файлах.
Резюме практики
- Створіть просте представлення, яке повертає текст "Ласкаво просимо!".
- Створіть для нього маршрут
/welcome/. - Реалізуйте динамічний маршрут
/user/<int:id>/, який виводить повідомлення з ID користувача. - Спробуйте обробити GET- та POST-запити в одному маршруті.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ