urlconf子產品感覺就像是“路由”,它分析請求的路徑,并請求派送給比對的view去處理
打開mysite.urls.py檔案,如下:
_____________________________________________________
from django.conf.urls import patterns, include, url
from views import home
import blog.urls
urlpatterns = patterns('',
url(r'^$', home),
url(r'^blog/', include(blog.urls))
)
-----------------------------------------------------
這裡url()函數中的第一個參數則是路徑的比對正則式,第二個參數是對應的view。
注意:home與blog.urls必須是提前import了的。不然解析器不知道home與blog.urls
是什麼,就會報錯。
由于python沒有強制類型,而且在運作時可以識别變量的類型,是以url()與include()
設計得很靈活。它們還可以支援名稱:
url(r'^$', 'mysite.views.home'),
url(r'^blog/', include('mysite.blog.urls'))
這裡用的是'mysite.views.home',注意是加了引号的,是字元串。
它的實作原理就是暫時記錄名稱,等manage.py運作起來之後再根據名稱去動态import
對應的對象。
注意:名稱必須是相對于manage.py的。'views.home', 'home'都是不正确的。
比對參數
~~~~~~~~
在url()中還可以從路徑上捕獲組,并以參數的形式傳給view函數。
urls.py :
___________________________________________________________________
url(r'^date/(\d{4})-(\d{1,2})-(\d{1,2})', 'mysite.views.date'),
)
-------------------------------------------------------------------
用正則式的組捕獲功能,将年月日分别捕獲出來。
views.py :
___________________________
def date(request, *args):
print(args)
return httpresponse()
---------------------------
讓view函數date接受一個可變參數args,然後将其列印出來。
請求127.0.0.1:8000/date/2015-12-24
運作時列印的結果:
(u'2014', u'12', u'24')
為了可讀性更好,我們可以将正則式這樣寫:
_______________________________________________________________________
url(r'^date/(?p<year>\d{4})-(?p<month>\d{1,2})-(?p<day>\d{1,2})',
'mysite.views.date'),
-----------------------------------------------------------------------
為每個組用(?p<name>xxxx)的方式命名。
而view這樣改一下:
_____________________________________
def date(request, year, month, day):
print('year:' + year)
print('month:' + month)
print('day:' + day)
-------------------------------------
添加yeas, month, day三個參數。而這三個參數與正則式的組名一一對應(在順序上
無需對應)。
再次通路:127.0.0.1:8000/date/2015-12-24
輸出結果:
year:2014
month:12
day:24
不僅如此,url()函數還有第三個參數,允許我們為view函數添加其它附加參數。
在urls.py添加url:
___________________________________________________________________________
url(r'^extra$', 'mysite.views.extra_param', {'abc':120, 'xyz':'hello'})
# ^^^^^^^^^^^^^^^^^^^^^^^^^^
---------------------------------------------------------------------------
在views.py中添加extra_param函數:
def extra_param(request, xyz, abc):
print(xyz)
print(abc)
通路 http://127.0.0.1:8000/extra
服務控制端列印結果:
hello
120
綜上,我們可以非常靈活地使用url()進行通路位址比對。
==========================================================================
關于urls.py中引用到的patterns(), url(), include()三個函數在:
django/conf/urls/__init__.py中定義。
include(arg, namespace=none, app_name=none)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include(arg)函數檢查${arg}子產品中是否包含urlpatterns屬性。
并傳回: (urlconf_module, app_name, namespace)
url(regex, view, kwargs=none, name=none, prefix='')
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
傳回一個regexurlpattern對象。
patterns(prefix, *args)
~~~~~~~~~~~~~~~~~~~~~~~
傳回一個regexurlpattern對象清單,并使清單中的每個成員的prefix都與函數的
prefix一緻。