Ответ
Функция 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.
Такое разделение позволяет создавать чистую и логичную систему маршрутизации, где пути отвечают за определение ресурса, а параметры — за его фильтрацию или представление.