Форум сайта python.su
Приветствую!
Помогите пожалуйста, начинающему понять логику работы urlConfig. Django 2.2, создано простейший проект и в нем простейшее приложение pages. Вот urpatterns проекта:
urlpatterns=[ path('admin/',admin.site.urls), path('',include('Pages.urls')), ]
urlpatterns=[ path('',views.showPage), path('test',views.showTest), ]
urlpatterns=[ path('admin/',admin.site.urls), path('',views.showProjectPage), ]
Отредактировано FishHook (Сен. 21, 2019 21:26:50)
Офлайн
mblandrда же не знаю, что вам сказать.
Почему на запрос test срабатывает showTest?
path('test', views.showTest),
Офлайн
path('test', views.showTest) находится в urlconfig у приложения pages. Как он попал на этот path?
Отредактировано mblandr (Сен. 21, 2019 21:30:49)
Офлайн
mblandr
Как он попал на этот path?
urlpatterns=[
path('admin/',admin.site.urls),
path('',include('Pages.urls')), # вот тут и попал
]
Офлайн
Да, но я же написал, что в этом path ‘' не соответствует запросу ’test', почему сработал include?
Офлайн
mblandrИнклуд собирает ВСЕ ваши урлы в единую иерархию. Вы присоединили ваш “Pages.urls” с ключом “”, почему по-вашему этот путь должен находиться в иерархии путей выше корня и что значит
Да, но я же написал, что в этом path ‘' не соответствует запросу ’test', почему сработал include?
mblandr.
сработал include
Отредактировано FishHook (Сен. 21, 2019 21:58:51)
Офлайн
Подождите, я правильно понял?
path(route,include('…')) не означает, что содержимое include будет включено, только если url запроса соответствует route -
это я так полагал,
а означает, что url диспетчер, когда дойдет до этой строки, включит содержимое include в любом случае, но сравниваться будет с частью строки запроса, у которой вырезано совпавшее с route?
Отредактировано mblandr (Сен. 21, 2019 22:21:14)
Офлайн
mblandr
Django-приложение - это wsgi приложение, если вы раньше писали на ПХП, то забудьте. Питоний скрипт в рамках WSGI не стартует каждый раз заново при обращении веб-сервера. Наоборот, веб-сервер обращается к уже запущенному экземпляру и после отработки запроса экземпляр не удаляется из памяти. То есть конфигурация УРЛов, ОРМов и прочего бойлейплейта сохраняется между запросами. То что вы сконфигурировали загружается в память один раз и живет все время работы сервера
не означает, что содержимое include будет включено, только если url запроса соответствует route
Офлайн
Спасибо, что помогли разобраться
Офлайн
Кстати, вы все таки неправы в
FishHookв отладочных сообщениях django показывает какой список urlpatterns он обрабатывает, и там четко видно, что если шаблон не соответствует url, то urlconfig, указанный в include, не загружается. Другое дело, что я не понимал, что если в path используется include (или если указана не view, а функция, возвращающая какой-то список из path), то сравнение url и шаблона происходит не 1:1, а проверяется, начинается ли url с шаблона
Сама конфигурация урлов никак не зависит от запроса.
Офлайн