JavaRush /Курси /Модуль 3: Django /Використання path() та re_path()

Використання path() та re_path()

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

Короткий зміст попередніх лекцій

Ми вже дізналися, що таке представлення (views) і як вони працюють у Django. Ви навчилися створювати функції представлень і зв'язувати їх із URL-адресами через urls.py. Ми розібрали, що таке URLConf і як він допомагає маршрутизувати запити в проєкті. Усе це дозволило вам зрозуміти, як обробляти запити від користувачів і повертати дані через ваш Django-додаток.

Сьогодні ми заглибимося в два потужних інструменти маршрутизації: функції path() і re_path(). Вони дозволяють вказати, які URL-адреси будуть оброблятися, якими представленнями, з можливістю додавання параметрів і навіть використання регулярних виразів.

path(): найкращий друг у світі маршрутизації

Що таке path()

path() — це основний інструмент для маршрутизації URL у сучасних версіях Django (з версії 2.0). Він був створений, щоб замінити стару та складну функцію url() із попередніх версій Django, зробивши маршрутизацію більш зрозумілою та зручною.

Синтаксис path():

path(route, view, kwargs=None, name=None)
  • route — це рядок, що задає шаблон URL.
  • view — представлення, яке буде викликано, якщо шаблон відповідає запиту.
  • kwargs — додаткові аргументи, які можна передати в представлення (рідше використовується).
  • name — ім'я маршруту, яке зручно використовувати для створення зворотних посилань.

Приклад використання path()

Створимо застосунок blog і додамо маршрути у його файлі urls.py:

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

urlpatterns = [
    path('articles/', views.article_list, name='article_list'),  # Маршрут для списку статей
    path('articles/<int:id>/', views.article_detail, name='article_detail'),  # Маршрут для окремої статті
]

Зверніть увагу на <int:id> — це динамічна частина URL, яка дозволяє отримувати параметр ID.

Тепер створимо відповідні представлення у файлі views.py:

from django.http import HttpResponse

def article_list(request):
    return HttpResponse("Список статей")

def article_detail(request, id):
    return HttpResponse(f"Стаття з ID {id}")

При переході за адресою /articles/, ви побачите текст "Список статей", а, наприклад, за адресою /articles/42/ — "Стаття з ID 42".

Типи конвертерів у path()

У path() можна використовувати типи конвертерів для динамічних URL. Це визначає тип даних, який буде передано в представлення. Ось основні конвертери:

Конвертер Опис
int Ціле число (0 або 42)
str Рядок (за замовчуванням, якщо не вказати тип)
slug "Чистий" текст: літери, цифри, дефіси
uuid UUID — універсальний унікальний ідентифікатор
path Рядок, який також включає /

Приклад використання конвертерів:

urlpatterns = [
    path('user/<int:id>/', views.user_detail),  # id — тільки ціле число
    path('post/<slug:slug>/', views.post_detail),  # slug — тільки коректний slug
]

Обробка помилок із path()

Якщо користувач спробує перейти за URL, який не відповідає маршрутам, налаштованим у urlpatterns, Django автоматично поверне помилку 404. Ви можете кастомізувати цю помилку, про це ми поговоримо в наступних лекціях.

re_path(): коли простоти path() недостатньо

re_path() використовується для більш складних випадків маршрутизації, де ви хочете задати URL за допомогою регулярних виразів. На відміну від path(), цей інструмент дає більше гнучкості, але вимагає знань регулярних виразів.

Синтаксис re_path() схожий на path():

re_path(regex, view, kwargs=None, name=None)
  • regex — регулярний вираз, що задає шаблон URL.
  • view — представлення, яке буде викликане, якщо регулярний вираз співпаде.
  • kwargs та name використовуються так само, як у path().

Приклад використання re_path()

Припустимо, що ви хочете дозволити маршрути з двома типами ідентифікаторів: або ціле число, або рядок. Тут стане в нагоді re_path():

from django.urls import re_path
from . import views

urlpatterns = [
    re_path(r'^articles/(?P<id>[0-9]+)/$', views.article_detail, name='article_detail_id'),  # ID — тільки числа
    re_path(r'^articles/(?P<slug>[-\w]+)/$', views.article_detail_by_slug, name='article_detail_slug'),  # SLUG
]

І відповідні представлення:

def article_detail(request, id):
    return HttpResponse(f"Стаття з ID {id}")

def article_detail_by_slug(request, slug):
    return HttpResponse(f"Стаття з SLUG {slug}")

Тепер маршрут /articles/42/ викличе перше представлення, а /articles/my-awesome-article/ викличе друге.

Коли використовувати re_path()

Хоча path() покриває більшість випадків, є ситуації, де re_path() незамінний:

  1. Вам потрібно враховувати складні шаблони URL (наприклад, поєднання літер і цифр).
  2. У вас є застарілий код з регулярними виразами, і ви не можете його змінити.
  3. У вас складна логіка маршрутизації, яку не можна описати конвертерами.

Типові помилки з re_path()

При використанні re_path() переконайтеся, що ваші регулярні вирази коректні і враховують усі аспекти передбачуваного URL. Наприклад, забувши додати ^ на початку або $ в кінці, ви можете зіткнутися з несподіваною поведінкою, оскільки такі регулярні вирази будуть частково співпадати з іншими маршрутами.

Порівняння path() та re_path()

Функція Простота використання Гнучкість Підходить для
path() Проста та інтуїтивна Обмежена типами конвертерів Більшість випадків
re_path() Вимагає знань регулярних виразів Максимальна гнучкість Складні шаблони URL

Приклад реалізації: об'єднуємо обидва підходи

Для демонстрації створимо застосунок, який буде підтримувати статті з ідентифікаторами та категоріями.

Файл urls.py:

from django.urls import path, re_path
from . import views

urlpatterns = [
    path('articles/', views.article_list, name='article_list'),
    path('articles/<int:id>/', views.article_detail, name='article_detail'),
    re_path(r'^categories/(?P<name>[-\w]+)/$', views.category_detail, name='category_detail'),
]

Файл views.py:

from django.http import HttpResponse

def article_list(request):
    return HttpResponse("Список всіх статей")

def article_detail(request, id):
    return HttpResponse(f"Детальна інформація про статтю з ID {id}")

def category_detail(request, name):
    return HttpResponse(f"Категорія: {name}")

Тепер ваш проєкт зможе обробляти адреси:

  • /articles/ — список статей.
  • /articles/42/ — стаття з ID 42.
  • /categories/technology/ — категорія "technology".

Завдяки таким маршрутам ви зможете налаштувати свою маршрутизацію максимально детально. Тепер ви готові не тільки обробляти "стандартні" запити через path(), але й справлятися зі складними завданнями маршрутизації за допомогою гнучкості re_path(). 🚀

3
Опитування
Вступ до представлень (views), рівень 3, лекція 4
Недоступний
Вступ до представлень (views)
Вступ до представлень (views)
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ