Маршруты и маршрутизатор

Для связи определенного интернет-адреса с соответствующим контролером необходимо выполнить следующие шаги:

  • объявить связь определенного пути или шаблона с нужным контроллером.

Путь – часть 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.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: