Старт був тут, а це продовження)
urls.py - забезпечує маршрутизацію. Да-да! Геніально! urls.py - забезпечує маршрутизацію для вашого проекта. Все просто, чи не так?) Як же воно там її забезпечує? - запитаєте ви. А так само просто як і називається файл! - відповім вам я і будь хто інший тоже.
Відкрикривши файл можна побачити таку картину:from django.conf.urls.defaults import patterns, include, url
urlpatterns = patterns('',)
от і вся малина, в patterns прописуємо шляхи плюс обробник для цього шляху, вигляд приблизно такий:
1) from django.conf.urls.defaults import patterns, include, url
from my_module import views
urlpatterns = patterns('',
(r'^first/$', views.first),
(r'^second/$', views.second),)
маршрути задаються регулярними виразами а обробник можна вказувати напряму як це показано вище, що правда перш ніж задавати потрібно імпортувати), також можна імпортувати зразу функції з класу views, але тоді буде надлишковість імпортів при збільшенні обробників. Також можна позбавитись великої кількості імпортів задаючи обробники простими символьними змінними:
2) from django.conf.urls.defaults import patterns, include, url
(r'^first/$', "my_module.views.first"),
(r'^second/$', "my_module.views.second"),)
Як доповнення можна передавати в якості першого параметру префікс до обробників щоб не дублювати рядки і їх скоротити:
2+) from django.conf.urls.defaults import patterns, include, url
urlpatterns = patterns('my_module.views',
(r'^first/$', "first"),
(r'^second/$', "second"),)
(r'^first/$', "first"),
(r'^second/$', "second"),)
Тут можна зауважити що для використання різних префіксів можна викориcтовувати таку шутку з urlpatterns:
2+) from django.conf.urls.defaults import patterns, include, url
urlpatterns = patterns('my_module.views',
(r'^first/$', "first"),
(r'^second/$', "second"),)
urlpatterns += patterns('my_other_module.views',
(r'^first/$', "next"),
ми просто додали до першого оприділення обробників інше)
(r'^first/$', "first"),
(r'^second/$', "second"),)
urlpatterns += patterns('my_other_module.views',
(r'^first/$', "next"),
ми просто додали до першого оприділення обробників інше)
+ який шаблон першим, такий і буде оброблятись ось і весі пріоритет:)
- - - - - - -
Як отприділити динамічні параметри в урл? Просто ті динамічні елементи виділяємо в дужки цим самим вказуючи що ми хочемо їх зберегти і не забуваємо що шаблон це регулярний вираз, в функцію обробник вони будуть передані в порядку їх запису в шаблоні. Для того щоб цим параметрам надати імена використовуєм наступну штуку:
(r'^blablabla/(?P<name>\d{4})$', "handle") # name - то назва змінної, а \d{4}- то рег. вираз якому має задовільняти наша змінна
Також можна передавати додаткові параметри в обробник заздалегіть визначені для певного шляху:
(r'^foo/$', "handle",{'template_name': 'template1.html'})
(r'^bar/$', "handle",{'template_name': 'template2.html'})
в даному випадку додаткові параметри використоані для виділення різних шляхів для одного обробника який по різному буде реагувати на два разні шляхи.
+ додатково передані дані перекривають дані отримані з шаблону якщо їхні імена співпадають
+ в самому обробнику можна вказата параметер по замовчуванню:
(r'^foo/$', "handle",{'template_name': 'template1.html'})
(r'^foo/(?P<name>\w{4})$', "handle",{'template_name': 'template1.html'}) # в urls.py
def handle(request, name="igor", template_name ) # в обробнику
в такому випадку якщо спрацює перший шаблон то буде використаний параметр по замовчуванню( це обовязково має бути символьна змінна).
- - - - - - -
При використанні функцій обробників для зменшення кількості повторювального коду можна використовувати функції обгортки та і інші функції посередники з параметрами що містять дійсно різні функції. Приклад обгортки:
def wrapper(spec_func):
def new_func(request, *args, **kwargs):
code
.
.
return spec_func(request, *args, **kwargs)
return new_func #таким чином перш ніж виконати функцію ми виконаєм дадатковий код
-----
(r'^foo/(?P<name>\w{4})$', wrapper(my_func)) #не забуваєм про імпорт
- - - - - - -
Можливе також розширення шляхів з допомогою include(), приклад:
(r'^blog/)$', include(ext_module.blog.urls))
частина foo буде відрізана від урл, а решта передасться в підключуваний модуль де продовжиться обробка урл. Слід зауважити що параметри які отримаються в такому випадку з шаблона, чи передаються як додаткові, будуть чеплятися для кожного шаблону в підключуваному файлі.
* дані з запитів отримуються тільки в вигляді символів, тож не треба забувати переводити їх до потрібного типу
No comments:
Post a Comment