URL dispatcher簡單點理解就是根據URL,將請求分發到相應的方法中去處理,它是對URL和View的一個映射,它的實現其實也很簡單,就是一個正則匹配的過程,事先定義好正則表達式和該正則表達式對應的view方法,如果請求的URL符合這個正則表達式,那么就分發這個請求到這個view方法中。
有了這個base,我們先拋出幾個問題,提前思考一下:
這個映射定義在哪里?當映射很多時,如果有效的組織?
URL中的參數怎么獲取,怎么傳給view方法?
如何在view或者是template中反解出URL?
好,先來看一個簡單的例子:
from django.conf.urls import patterns, url, includeurlpatterns = patterns('', url(r'^articles/2003/$', 'news.views.special_case_2003'), url(r'^articles/(/d{4})/$', 'news.views.year_archive'),)urlpatterns += patterns('', url(r'^articles/(?P<year>/d{4})/(?P<month>/d{2})/$', 'news.views.month_archive'), url(r'model/', include('model_test.urls')),)這段代碼就是一個URL Dispatcher的例子,它在一個單獨的python模塊定義,Django中管這個模塊叫做URLconf,其實,就是通過python代碼方式實現的配置文件,在這個配置中定義了URL路徑和對應的處理方法之間的映射。在Django中,是通過“樹”的結構來管理URLconf之間的關系的,在Django中的主配置文件中,有一個叫做ROOT_URL_CONF的配置項,就是用來指定根URLconf,從根URLconf開始,逐條進行匹配,直到找到匹配項為止,這就是我們上面提到的第一個問題的答案,下面還會再仔細剖析。
在上面例子中,我們可以看到有3個方法:patterns, url, include。url方法構建了一個URL到View方法的映射關系對象,patterns將這些映射關系對象組織成為一個python的列表,那include是做什么的呢?它就是我們上面說到的“樹”結構關系的聯系者,include會關聯其他的URLconf到本URLconf,也就是說include關聯的是孩子節點。整個URL dispatcher體系,就是由這三個方法構建起來的,下面我們重點來介紹這三個方法,了解了這三個方法,整個URL映射機制就會非常清楚了。
def patterns(prefix, *args): passdef url(regex, view, kwargs=None, name=None, prefix=''): passdef include(arg, namespace=None, app_name=None): pass
url()
先來看下最重要的url()方法。第一個參數regex是代表URL的正則表達式,第二個參數指定了和該正則表達式映射的View,此外,還可以通過kwargs參數,給view方法指定默認的kwargs參數,還有name參數,用來命名該URL,主要用在URL反解中,至于prefix用處不大,不解釋。
url()方法最終構造了一個對象,我們姑且叫它URL映射對象,當第一次訪問這個對象去匹配URL時,它會把這個對象中的正則表達式編譯一次,然后保存在該對象中,所以以后再次匹配時,就會很快,不會重復編譯該正則表達式了。在這里正則匹配其實就是用就是python的re模塊,使用過程大致如下:
新聞熱點
疑難解答