Маршрутизация URL: path(), re_path(), include()

Маршрутизация URL: path(), re_path(), include() Django

Привет! В прошлых статьях мы создали проект и приложение. Теперь давай разберёмся, как Django направляет пользователя по нужным страницам — это называется маршрутизацией URL.

В этой статье мы разберём:

  • Что такое маршрутизация URL
  • Функция path() и конвертеры
  • Функция re_path() и регулярные выражения
  • Функция include() для подключения URL

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный Django
  • Созданный проект и приложение

Совет: Маршрутизация — это «карта» сайта. Она связывает URL с представлениями (views).

Основная часть

Что такое маршрутизация URL

Маршрутизация URL — это процесс сопоставления URL-адресов с представлениями (views).

Когда пользователь переходит по ссылке, Django проходит по списку urlpatterns и ищет первый подходящий маршрут.

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),        # Главная
    path('about/', views.about, name='about'),  # О нас
    path('posts/', views.posts, name='posts'),  # Посты
]

Функция path()

path() — это основной способ создания маршрутов в Django.

Синтаксис:

path(путь, представление, имя_маршрута)

Примеры:

from django.urls import path
from . import views

urlpatterns = [
    # Простой маршрут
    path('', views.index, name='index'),

    # Маршрут с текстом
    path('about/', views.about, name='about'),

    # Маршрут с параметром
    path('post/<int:post_id>/', views.post_detail, name='post_detail'),
]

Конвертеры путей

Конвертеры позволяют передавать параметры из URL в представление.

КонвертерТипПример
strСтрока (по умолчанию)<str:name>
intЦелое число<int:post_id>
slugSlug (буквы, цифры, дефис, подчёркивание)<slug:slug>
uuidUUID<uuid:uuid>
pathПуть с слешами<path:path>

Примеры:

# Целое число
path('post/<int:post_id>/', views.post_detail, name='post_detail')

# Строка
path('user/<str:username>/', views.user_profile, name='user_profile')

# Slug
path('article/<slug:article_slug>/', views.article_detail, name='article_detail')

В представлении:

def post_detail(request, post_id):
    # post_id — это int
    return HttpResponse(f"Пост №{post_id}")

Функция re_path()

re_path() позволяет использовать регулярные выражения для создания более гибких маршрутов.

Синтаксис:

from django.urls import re_path

urlpatterns = [
    re_path(r'^article/(?P<year>[0-9]{4})/$', views.year_archive, name='year_archive'),
]

Пример с регулярным выражением:

from django.urls import re_path
from . import views

urlpatterns = [
    # Год из 4 цифр
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

    # Месяц из 2 цифр
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),

    # Строка из букв
    re_path(r'^hello/(?P<name>[a-zA-Z]+)/$', views.hello_name),
]

В представлении:

def year_archive(request, year):
    # year — строка, но можно преобразовать в int
    return HttpResponse(f"Архив за {year} год")

Важно: re_path() полезен для сложных маршрутов, но для большинства задач достаточно path().

Функция include()

include() используется для подключения URL-маршрутов из других файлов (обычно из приложений).

Структура проекта:

myproject/
    mysite/
        urls.py          # Главный файл маршрутов
    polls/               # Приложение
        urls.py          # Маршруты приложения

Главный urls.py:

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('polls/', include('polls.urls')),  # Подключаем маршруты приложения
    path('blog/', include('blog.urls')),    # Подключаем маршруты блога
]

Файл urls.py в приложении polls:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),                    # /polls/
    path('<int:question_id>/', views.detail, name='detail'), # /polls/1/
]

Совет: include() делает проект модульным. Каждое приложение управляет своими маршрутами.

Именованные маршруты (name)

name позволяет ссылаться на маршрут по имени, а не по URL. Это удобно при изменении URL.

# urls.py
path('posts/', views.post_list, name='post_list')
path('posts/<int:post_id>/', views.post_detail, name='post_detail')

Использование в шаблонах:

<a href="{% url 'post_list' %}">Все посты</a>
<a href="{% url 'post_detail' post_id=1 %}">Пост №1</a>

Использование в представлениях:

from django.urls import reverse

url = reverse('post_detail', kwargs={'post_id': 1})
# /posts/1/

Полный пример

mysite/urls.py:

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),          # Главная страница
    path('polls/', include('polls.urls')),   # Опросы
]

polls/urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('<int:question_id>/', views.detail, name='detail'),
    path('<int:question_id>/results/', views.results, name='results'),
]

blog/urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('<int:post_id>/', views.post_detail, name='post_detail'),
]

Задачи для закрепления

Задача 1. Создай маршрут для страницы с постами: /posts/.

Задача 2. Создай маршрут для страницы с постом: /posts/1/.

Задача 3. Подключи URL приложения через include().

Задача 4. Создай маршрут с параметром через re_path().

Задача 5. Напиши представление для маршрута с параметром.

Ответы:

Задача 1.

path('posts/', views.posts, name='posts')

Задача 2.

path('posts/<int:post_id>/', views.post_detail, name='post_detail')

Задача 3.

path('polls/', include('polls.urls'))

Задача 4.

re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive)

Задача 5.

def year_archive(request, year):
    return HttpResponse(f"Архив за {year} год")

Нюансы и подводные камни

Порядок маршрутов

Порядок маршрутов важен. Более конкретные маршруты должны идти раньше общих.

# Правильно
path('posts/new/', views.new_post, name='new_post'),
path('posts/<int:post_id>/', views.post_detail, name='post_detail'),

# Неправильно (new/ не будет достигнуто)
path('posts/<int:post_id>/', views.post_detail, name='post_detail'),
path('posts/new/', views.new_post, name='new_post'),

Имена маршрутов

Имена маршрутов должны быть уникальными в пределах проекта.

include() с пространством имён

path('polls/', include('polls.urls', namespace='polls'))

Частые ошибки и как их избежать

Ошибка 1: Неправильный порядок маршрутов

Сначала конкретные, потом общие.

Ошибка 2: Забыл импортировать include

from django.urls import include, path

Ошибка 3: Неправильный синтаксис регулярного выражения

Проверяй регулярные выражения в re_path().

Шпаргалка

Что нужноКак пишется
Простой маршрутpath('about/', views.about)
Маршрут с параметромpath('post/<int:post_id>/', views.post_detail)
Маршрут с именемpath('', views.index, name='index')
Регулярное выражениеre_path(r'^article/([0-9]{4})/$', views.article)
Подключение приложенияpath('polls/', include('polls.urls'))

Заключение

Сегодня мы:

  • Разобрали маршрутизацию URL в Django
  • Изучили path()re_path()include()
  • Узнали о конвертерах и регулярных выражениях
  • Создали именованные маршруты

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×