Какая часть URL-адреса обрабатывается функцией path() в Django

Ответ

Функция 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=jsonGET-параметры (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:

  1. Django берет путь /api/users/123/ и находит совпадение с path('api/users/<int:user_id>/', ...).
  2. Он извлекает 123 и передает его в get_user_profile как аргумент user_id.
  3. Внутри view мы отдельно получаем значение format из request.GET.

Такое разделение позволяет создавать чистую и логичную систему маршрутизации, где пути отвечают за определение ресурса, а параметры — за его фильтрацию или представление.