Программа курса:
Регулярные выражения в маршрутах 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 адреса.