url函数详解
url函數(shù)詳解
?
url()函數(shù)在urls.py文件中可以說(shuō)是最重要的函數(shù),屬于核心。主要功能就是利用正則表達(dá)式匹配對(duì)應(yīng)的url并且指明處理函數(shù)。下面詳細(xì)講解這部分的應(yīng)用。我們從參數(shù)著手,先講解基礎(chǔ)用法,然后在用示例展示一些高級(jí)用法。
?
url有四個(gè)參數(shù),分別是兩個(gè)必選參數(shù):regex、view和兩個(gè)可選參數(shù):kwargs、name。下面分別介紹。
?
regex
?
regex代表一個(gè)正則表達(dá)式,凡是與regex匹配的URL請(qǐng)求都會(huì)執(zhí)行到url()函數(shù)中對(duì)應(yīng)的第二個(gè)參數(shù)view代表的視圖函數(shù)中。需要注意的是:正則表達(dá)式不會(huì)匹配URL中的域名和查詢參數(shù),如:http://192.168.1.10:8000/article/?page=1,Django只找article/。正則表達(dá)式在URLconf模塊加載時(shí)就編譯好了,所以在匹配的時(shí)候速度是很快的。
?
正則表達(dá)式中遇到的一些情況:
1.??????正則表達(dá)式字符串的開(kāi)頭字母“r”。它告訴Python這是個(gè)原始字符串,不需要處理里面的反斜杠(轉(zhuǎn)義字符)。在普通Python字符串中,反斜杠用于特殊字符的轉(zhuǎn)義。當(dāng)你用r把它標(biāo)示為一個(gè)原始字符串后,Python不再視其中的反斜杠為轉(zhuǎn)義字符。
2.??????url中常用的正則表達(dá)式符號(hào):除了^ 和 $ 表示以開(kāi)頭和結(jié)尾外還有一些正則表達(dá)式符號(hào)可能會(huì)用到:
?
?
view
?
Django匹配正則表達(dá)式成功后,就會(huì)找到相應(yīng)的視圖函數(shù)進(jìn)行處理。這個(gè)函數(shù)通常寫(xiě)在views中,關(guān)于views的詳細(xì)內(nèi)容我們后面會(huì)views部分還會(huì)講解。
?
?
kwargs
?
kwargs就是一個(gè)字典類型的參數(shù),它的使用方式如:
?
url(r'^archive /(d{4})/$', archive, {'dict':True}),
?
這里的kwargs 就是{'summary': True},可以直接向視圖函數(shù)對(duì)應(yīng)的傳參,相當(dāng)于字典方式傳參。另外還有一種方式為位置傳參,即(d{4})的部分。注意第一個(gè)括號(hào)中的內(nèi)容會(huì)傳給視圖函數(shù)的第二個(gè)參數(shù)(第一個(gè)是request),第二個(gè)括號(hào)部分傳給第三個(gè),以此類推。
?
視圖函數(shù)中就是這樣使用接收相應(yīng)參數(shù):
?
def archive(request, archive_id, dict):
?
?
name
?
name是為了提高模版的靈活性。Djangotemplate中經(jīng)常會(huì)有一些url的標(biāo)識(shí),如: <a href="/login"class="head">請(qǐng)登錄<span>|</span></a>?這種硬編碼的方式,模版難以維護(hù)。內(nèi)建標(biāo)簽url,{% url path.to.some_view%}可以返回視圖函數(shù)對(duì)應(yīng)的URL(相對(duì)域名的絕對(duì)路徑),比如url(r^/account/$’, views.index, name=index),使用{% url view.index%}將返回/accout/,這樣做可以方便修改。
?
Include的使用
?
Include函數(shù)對(duì)應(yīng)返回值可以用作url函數(shù)的第二個(gè)參數(shù),作為url的引用。例如:
# urls.py
?
from django.conf.urls? import *
?
urlpatterns = patterns('',
???(r'^blog/', include('myapp.urls')),
)
表示url blog/ 對(duì)應(yīng)的轉(zhuǎn)入inner函數(shù)繼續(xù)進(jìn)行url處理,通常就是我們所說(shuō)的app內(nèi)的url文件
?
#app內(nèi)urls.py
?
from django.conf.urls? import *
?
urlpatterns = patterns('',
???(r'^archive/$', 'mysite.views.archive'),?對(duì)應(yīng)的url實(shí)際是? blog/archive/
???(r'^about/$', 'mysite.views.about'),
???(r'^rss/$', 'mysite.views.rss'),
)
如果在上一層url加入第三個(gè)參數(shù)字典,則表示在其下一層所有的url中都加入此字典,如下兩個(gè)代碼等價(jià):
?
第一個(gè):
?
# urls.py
?
from django.conf.urls.defaults import *
?
urlpatterns = patterns('',
???(r'^blog/', include('inner'), {'blogid': 3}),
)
?
# inner.py
?
from django.conf.urls.defaults import *
?
urlpatterns = patterns('',
???(r'^archive/$', 'mysite.views.archive'),
???(r'^about/$', 'mysite.views.about'),
???(r'^rss/$', 'mysite.views.rss'),
)
第二個(gè)
?
# urls.py
?
from django.conf.urls.defaults import *
?
urlpatterns = patterns('',
???(r'^blog/', include('inner')),
)
?
# inner.py
?
from django.conf.urls.defaults import *
?
urlpatterns = patterns('',
???(r'^archive/$', 'mysite.views.archive', {'blogid': 3}),
???(r'^about/$', 'mysite.views.about', {'blogid': 3}),
???(r'^rss/$', 'mysite.views.rss', {'blogid': 3}),
)
?
如果在上一層想表達(dá)什么都不匹配直接進(jìn)入下一層匹配的時(shí)候用如下代碼:
?(r'^', include('myapp.urls')),? 即相當(dāng)于直接匹配app中url對(duì)應(yīng)的正則表達(dá)式匹配
)
?
?
調(diào)試模式
?
在url中經(jīng)常用到一些調(diào)試模式,決定有些url是否執(zhí)行:
?
if settings.DEBUG:
???urlpatterns += patterns('',
???????(r'^debuginfo/$', views.debug),
)
?
重用命名組
?
上面我們講到向視圖函數(shù)中傳參,位置傳參不需要指定視圖函數(shù)中參數(shù)的名稱,但是通過(guò)下面的用法P?<參數(shù)名> 的方式可以強(qiáng)行指定視圖函數(shù)中必須對(duì)應(yīng)那個(gè)名稱的參數(shù)
?
urlpatterns = patterns('',
???(r'^articles/(?P<year>\d{4})/$', views.year_archive),
???(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$',views.month_archive),
)
?
?
不同的url對(duì)應(yīng)相同的處理函數(shù)
?
實(shí)際這種情況也經(jīng)常發(fā)生,我們可以通過(guò)url的第三個(gè)參數(shù)傳入使用模板的名字,這樣不同的url對(duì)應(yīng)相同的函數(shù),使用不同模板。
?
urlpatterns = patterns('',
???(r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
???(r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
)
?
總結(jié)
- 上一篇: Euler Finance 完成 320
- 下一篇: VISIO2003基本形状