Как Django сопоставляет URL-адрес запроса с соответствующим обработчиком (view)?

«Как Django сопоставляет URL-адрес запроса с соответствующим обработчиком (view)?» — вопрос из категории Django, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Django обрабатывает URL-адреса с помощью механизма URL-диспетчера (URL dispatcher). Его основная задача — сопоставить запрошенный URL с конкретной функцией или классом-представлением (view), который сгенерирует ответ.

Процесс состоит из следующих шагов:

  1. Входная точка: Веб-сервер передает запрос Django. Django определяет корневой файл URL-конфигурации (обычно urls.py в папке проекта), указанный в настройке ROOT_URLCONF.
  2. Поиск по urlpatterns: Django последовательно перебирает все шаблоны в списке urlpatterns в этом файле.
  3. Первое совпадение: Как только находится первый шаблон, соответствующий запрошенному URL, поиск прекращается.
  4. Вызов View: Django вызывает связанную с этим шаблоном view-функцию, передавая ей объект HttpRequest и любые параметры, извлеченные из URL (например, year из articles/<int:year>/).
  5. Генерация ответа: View-функция обрабатывает запрос и возвращает объект HttpResponse.

Пример urls.py:

from django.urls import path
from . import views # views.py в том же приложении

urlpatterns = [
    # URL: /articles/
    path('articles/', views.article_list, name='article-list'),

    # URL: /articles/2023/
    # <int:year> - это "конвертер пути", который захватывает целое число
    # и передает его в view как аргумент `year`
    path('articles/<int:year>/', views.article_archive, name='article-archive-year'),
]

Ключевые особенности системы:

  • Конвертеры путей (Path Converters): Использование int:, slug:, str: для автоматического захвата и преобразования типов параметров из URL.
  • Обратный вызов URL (Reverse URL resolving): Использование имен (name='article-list') для генерации URL в шаблонах и коде ({% url 'article-list' %}), что делает код более гибким и устойчивым к изменениям.
  • Вложенные urlpatterns: Возможность подключать файлы urls.py из отдельных приложений с помощью функции include(), что способствует модульности.
  • Регулярные выражения: Для сложных шаблонов можно использовать re_path() вместо path().