Найти - Пользователи
Полная версия: urlConfig я что-то не понимаю
Начало » Django » urlConfig я что-то не понимаю
1
mblandr
Приветствую!
Помогите пожалуйста, начинающему понять логику работы urlConfig. Django 2.2, создано простейший проект и в нем простейшее приложение pages. Вот urpatterns проекта:
   
urlpatterns=[
    path('admin/',admin.site.urls),
    path('',include('Pages.urls')),
]
Вот приложения:
   
urlpatterns=[
    path('',views.showPage),
    path('test',views.showTest),
]
Почему на запрос test срабатывает showTest? Где я не понимаю логики работы? ‘test’ не соответствует ни ‘admin’, ни ‘', должно возвращаться 404?
Предположим, что ’' соответствует любой строке запроса. Но тогда
1)почему на test срабатывает showtest, а не showpage?
2)почему на запрос, например, anothertest возвращается 404, а не срабатывает showPage?
3)почему на таком urlconfigs у проекта:
   
urlpatterns=[
    path('admin/',admin.site.urls),
    path('',views.showProjectPage),
]
на любой запрос получаю 404, а showProjectPage не срабатывает?

Если же обрабатываются все urlconfigs, и проекта и приложений, то почему, если убрать path c include из urlconfig проекта, то urlconfig приложения не обрабатывается? Помогите разобраться.
FishHook
mblandr
Почему на запрос test срабатывает showTest?
да же не знаю, что вам сказать.

   
path('test',  views.showTest),

вот это не очевидно?
mblandr
path('test', views.showTest) находится в urlconfig у приложения pages. Как он попал на этот path?
FishHook
mblandr
Как он попал на этот path?

Эмммм, вот так

urlpatterns=[
path('admin/',admin.site.urls),
path('',include('Pages.urls')), # вот тут и попал
]
mblandr
Да, но я же написал, что в этом path ‘' не соответствует запросу ’test', почему сработал include?
FishHook
mblandr
Да, но я же написал, что в этом path ‘' не соответствует запросу ’test', почему сработал include?
Инклуд собирает ВСЕ ваши урлы в единую иерархию. Вы присоединили ваш “Pages.urls” с ключом “”, почему по-вашему этот путь должен находиться в иерархии путей выше корня и что значит
mblandr
сработал include
.
Он в любом случае срабатывает, “срабатывание” происходит на этапе импорта.
mblandr
Подождите, я правильно понял?
path(route,include('…')) не означает, что содержимое include будет включено, только если url запроса соответствует route -
это я так полагал,
а означает, что url диспетчер, когда дойдет до этой строки, включит содержимое include в любом случае, но сравниваться будет с частью строки запроса, у которой вырезано совпавшее с route?
FishHook
mblandr
Django-приложение - это wsgi приложение, если вы раньше писали на ПХП, то забудьте. Питоний скрипт в рамках WSGI не стартует каждый раз заново при обращении веб-сервера. Наоборот, веб-сервер обращается к уже запущенному экземпляру и после отработки запроса экземпляр не удаляется из памяти. То есть конфигурация УРЛов, ОРМов и прочего бойлейплейта сохраняется между запросами. То что вы сконфигурировали загружается в память один раз и живет все время работы сервера

не означает, что содержимое include будет включено, только если url запроса соответствует route

это содержимое включается единожды и потом работает как шаблон для выбора того или иного контроллера. Сама конфигурация урлов никак не зависит от запроса.
mblandr
Спасибо, что помогли разобраться
mblandr
Кстати, вы все таки неправы в
FishHook
Сама конфигурация урлов никак не зависит от запроса.
в отладочных сообщениях django показывает какой список urlpatterns он обрабатывает, и там четко видно, что если шаблон не соответствует url, то urlconfig, указанный в include, не загружается. Другое дело, что я не понимал, что если в path используется include (или если указана не view, а функция, возвращающая какой-то список из path), то сравнение url и шаблона происходит не 1:1, а проверяется, начинается ли url с шаблона
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB