Ответ
Функция path()
в Django обрабатывает только компонент пути URL-адреса, игнорируя домен, протокол, GET-параметры и якоря (фрагменты).
Рассмотрим полный URL:
https://example.com/api/users/123/?format=json#details
Django разделит его на части:
https://example.com
— протокол и домен (игнорируются маршрутизатором)./api/users/123/
— путь (path). Именно эта часть сопоставляется с шаблонами вurls.py
.?format=json
— GET-параметры (query string). Они не участвуют в маршрутизации, но доступны внутри view через объектrequest.GET
.#details
— якорь (fragment). Обрабатывается на стороне клиента (в браузере) и никогда не отправляется на сервер.
Пример:
Допустим, у нас есть следующий urls.py
:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('api/users/<int:user_id>/', views.get_user_profile),
]
И соответствующая view-функция:
# views.py
from django.http import HttpResponse
def get_user_profile(request, user_id):
# Получаем GET-параметр 'format', если он есть
output_format = request.GET.get('format', 'html') # 'json'
# user_id (123) был извлечен из пути функцией path()
return HttpResponse(f"Profile for user {user_id} in {output_format} format.")
Когда пользователь переходит по URL https://example.com/api/users/123/?format=json
:
- Django берет путь
/api/users/123/
и находит совпадение сpath('api/users/<int:user_id>/', ...)
. - Он извлекает
123
и передает его вget_user_profile
как аргументuser_id
. - Внутри view мы отдельно получаем значение
format
изrequest.GET
.
Такое разделение позволяет создавать чистую и логичную систему маршрутизации, где пути отвечают за определение ресурса, а параметры — за его фильтрацию или представление.