天天看點

Django學習筆記之——Urls

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一緻。