Для связи определенного интернет-адреса с соответствующим контролером необходимо выполнить следующие шаги:
- объявить связь определенного пути или шаблона с нужным контроллером.
Путь – часть URL, расположенная между адресом текущего хоста и GET-параметрами. Начальный слеш в шаблонном пути не ставится, в конце должен присутствовать.
- оформить все объявленные маршруты в специальный список маршрутов;
- маршруты необходимо оформить в заранее определенном формате, чтобы подсистема маршрутизатора смогла корректно с ним взаимодействовать.
После поступления запроса Django выделяет из переданного URL путь и передает его маршрутизатору. Далее происходит последовательное сравнение его с элементами списка маршрутов (сверху вниз). Первое найденное совпадение инициирует передачу управления контролеру, который связан с данным шаблонным путем.
Чтобы при переходе по адресу http://localhost:8000/bboard/ активировался контроллер index(), необходимо явно связать его с шаблоном URL bboard/.
Для этого необходимо открыть файл urls.py, расположенный в каталоге с именем проекта. По умолчание содержимое файлы следующее:
from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/ ', admin.site.urls), ]
Список маршрутов присваивается переменной urlpatterns в виде обычного списка Python. Каждый элемент данного списка должен представляться как результат, полученный от функции path() (модуль django.urls). Данная функция принимает на вход ссылку на соответствующий контроллер-функцию и строку с шаблоном URL.
В функцию path() также можно передать перечень маршрутов уровня приложения (в качестве второго параметра). Этот вариант и продемонстрирован в листинге 1.
Теперь добавим в список по умолчанию новый маршрут, обрабатывающий путь bboard/, связывая его с контролером-функцией index(). Для этого содержимое файла urls.py необходимо привести к следующему виду:
from django.contrib import admin from django.urls import path from bboard.views import index urlpatterns = [ path(' bboard/', index), path('admin/ ', admin.site.urls), ]
После сохранения файла запустим отладочный веб-сервер и откроем страницу http://localhost:8000/bboard/.
Маршрутизатор Django не требует, чтобы нужный адрес совпадал полностью, достаточно, если совпадет только начало.
Ранее упоминалось, что функция path() позволяет использовать в качестве второго параметра не ссылку на контроллер-функцию, а другой список маршрутов (по принципу вложенных каталогов на ПК). В этом случае маршрутизатор после фиксации совпадения удаляет начальную часть (текущий поиск) и продолжает проверку по вложенному списку.
Это позволяет сделать удобную иерархию списков маршрутов, что облегчает работу с большими проектами. В список пакета конфигурации (уровень проект) запишем маршрут, который указывает на вложенный список конкретного приложения (уровень приложения). А уже во вложенном списке укажем ссылки на нужные контроллеры.
Сначала изменим список маршрутов уровня приложения bboard. Для этого необходимо в каталоге bboard создать файл urls.py и добавить в него следующий код:
from django.urls import path from bboard.views import index urlpatterns = [ path(' ', index), ]
Далее необходимо изменить код файла urls.py пакета конфигурации:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path(' bboard/', include('bboard.urls')), path('admin/ ', admin.site.urls), ]
Как видно, вторым параметром функции path(), указывается вложенный список маршрутов, который представляет собой результат, полученный от функции include() (модуль django.urls). Данная функция принимает только один параметр – путь к модулю, где указан список маршрутов нижележащего уровня.
При получении запроса http://localhost:8000/bboard/ маршрутизатор обнаружит совпадение с bboard/ в первом маршруте. Данный префикс будет автоматически удален, после чего будет продолжен поиск с новым путем (в данном случае это пустая строка). Новый путь совпадает с единственной записью вложенного списка, что приведет к запуску функции index() – откроется интернет-страница с соответствующей фразой.
В списке уровня проекта также присутствует второй маршрут (добавляется по умолчанию):
path(‘admin/’, admin.site.urls),
Данный маршрут обеспечивает связь шаблона admin/ с набором маршрутов, который хранится в свойстве urls экземпляра класса AdminSite. Хранится он в переменной site и обеспечивает доступ к административному разделу сайта Django.