Saturday, February 4, 2012

Роутинг в Django

Старт був тут, а це продовження)
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
     urlpatterns = patterns('',
                       (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"),)

Тут можна зауважити що для використання різних префіксів можна викори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'^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

 
 
Blogger Templates