Программа курса:
Регулярные выражения в маршрутах Django
Вот краткий обзор наиболее часто используемых символов и конструкций, которые можно использовать для определения шаблонов URL-адресов на основе регулярных выражений:
Основные символы:
.
(точка): Соответствует любому одному символу (кроме новой строки).^
: Соответствует началу строки.$
: Соответствует концу строки.*
: Соответствует нулю или более повторениям предшествующего символа или группы.+
: Соответствует одному или более повторениям предшествующего символа или группы.?
: Соответствует нулю или одному повторению предшествующего символа или группы.{}
: Указывает количество повторений предшествующего символа или группы. Например,{3}
— три повторения,{3,}
— три или более,{3,5}
— от трех до пяти.[]
: Указывает набор символов. Например,[abc]
— a, b или c;[a-z]
— любая строчная буква;[^abc]
— любой символ, кроме a, b и c.|
: Альтернатива. Например,cat|dog
— соответствует “cat” или “dog”.()
: Группирует выражения. Например,(ab){2}
— соответствует “abab”.\
: Экранирует специальные символы. Например,\.
соответствует точке,\*
соответствует звездочке.\d
: Соответствует любой цифре (0-9).\D
: Соответствует любому символу, кроме цифры.\s
: Соответствует любому пробельному символу (пробел, табуляция, новая строка).\S
: Соответствует любому символу, кроме пробельного.\w
: Соответствует любой букве, цифре или подчеркиванию.\W
: Соответствует любому символу, кроме буквы, цифры или подчеркивания.
Именованные группы:
(P<name>pattern)
: Создает именованную группу с именем name
, которая соответствует pattern
. Это может быть использовано для извлечения параметров пути.
Ниже приведены примеры регулярных выражений для определения паттернов URL и соответствующие им URL-адреса. Обратите внимание, что эти примеры предназначены для иллюстрации и могут потребовать модификации в зависимости от конкретных требований вашего приложения. Также важно помнить, что в современных версиях Django предпочтительнее использовать path()
с конвертерами, а не re_path()
.
Примеры с использованием именованных групп:
Регулярное выражение | URL-адрес | Описание |
---|---|---|
^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$ | /articles/2024/03/15/ | Извлекает год, месяц и день из URL. |
^products/(?P<category>\w+)/(?P<slug>[\w-]+)/$ | /products/electronics/my-product/ , /products/clothing/new-dress/ | Извлекает категорию и slug продукта. |
^users/(?P<username>\w+)/$ | /users/john_doe/ , /users/jane_123/ | Извлекает имя пользователя (буквы, цифры, подчеркивание). |
^blog/(?P<pk>\d+)/$ | /blog/123/ , /blog/456/ | Извлекает первичный ключ (целое число). |
Примеры без именованных групп (менее предпочтительны):
Регулярное выражение | URL-адрес | Описание |
---|---|---|
^articles/\d{4}/\d{2}/\d{2}/$ | /articles/2024/03/15/ | Соответствует URL с датой, но не извлекает значения. |
^products/\w+/[\w-]+/$ | /products/electronics/my-product/ | Соответствует URL, но не извлекает значения. |
^contact/(email|phone)/$ | /contact/email/ , /contact/phone/ | Соответствует URL, но не извлекает значения. |
Рекомендации:
- Используйте именованные группы: Они делают ваш код более читаемым и позволяют легко извлекать значения из URL-адреса.
- Будьте конкретными: Избегайте использования слишком общих регулярных выражений (например,
.+
), которые могут случайно соответствовать нежелательным URL-адресам. - Проверяйте валидацию: После извлечения значений из URL-адреса, убедитесь, что они валидны перед их использованием.
- Используйте конвертеры Django: Вместо
re_path
, используйтеpath
с конвертерами Django (например,<int:pk>
,<str:slug>
) для более чистого и поддерживаемого кода.
Эти примеры помогут вам начать работу с регулярными выражениями в URLconf Django. Помните, что правильное использование регулярных выражений критически важно для создания надежного и масштабируемого веб-приложения.
Передача значений в функцию
Нами были рассмотрены все параметры функций path()
и re_path()
, кроме параметра kwargs
, который позволяет передать в представление дополнительные значения. Например, если мы перепишем код функции about()
, которая содержится в файле views.py
, на следующий:
from django.http import HttpResponse
def index(request):
return HttpResponse('<h2>Главная</h2>')
def about(request, name, age):
return HttpResponse(f'''
<h2>О пользователе</h2>
<p>Имя: {name}</p>
<p>Возраст: {age}</p>
''')
def contact(request):
return HttpResponse('<h2>Контакты</h2>')
Теперь функция about()
будет принимать два дополнительных параметра: name
и age
(имя и возраст пользователя) и отправлять их значения пользователю вместе с остальным контентом.
Чтобы передать значения этих параметров из маршрута, изменим код в файле urls.py
следующим образом:
from django.urls import path, re_path
from blog import views
urlpatterns = [
path('', views.index),
path('about/', views.about, kwargs={"name": "Tom", "age": 38}),
re_path(r'^contact/', views.contact),
]
Теперь функция path()
будет передавать в функцию about()
параметры name
и age
, значения которых будут извлекаться из словаря kwargs
.
Если мы выполним запрос по URL-адресу /about/
, который будет обработан функцией about()
, то мы увидим в браузере соответствующий ответ:
В этом примере данные, в представление, передаются через словарь, в следующем шаге мы научимся извлекать эти данные из пути URL адреса.