Django url() 函数详解
url()函數(shù)看起來的格式象: url(r^/account/$’, views.index, name=index) ,它可以接收四個參數(shù),分別是兩個必選參數(shù): regex 、 view 和兩個可選參數(shù): kwargs 、 name ,接下來詳細介紹這四個參數(shù)。
regex
regex代表一個正則表達式,凡是與regex匹配的URL請求都會執(zhí)行到url()函數(shù)中對應(yīng)的第二個參數(shù) view 代表的視圖函數(shù)中。需要注意的是:正則表達式不會匹配URL中的域名和查詢參數(shù),如:http://www.foofish.net/article/?page=3, Django只找 article/ 。正則表達式在URLconf模塊加載時就編譯好了,所以在匹配的時候速度是很快的。
view
Django匹配正則表達式成功后,就會找到相應(yīng)的視圖函數(shù),Django始終用HttpRequest對象作為第一個參數(shù)傳遞給視圖函數(shù),此外使用regex參數(shù)中攜帶的參數(shù)作為可選參數(shù)傳遞給視圖函數(shù)。如: url(r’^(?P\d+)/′,views.detail,name=′detail′),,括號對(?P<articleid>\d+)里面的參數(shù)將作為第二個參數(shù)傳遞給視圖函數(shù)detail(request,articleid),這里參數(shù)的名字必須一模一樣。因為你在url函數(shù)中顯示的指定了該參數(shù)的名字,當(dāng)然你也可以不顯示的指定,如:url(r′(\d+)/’, views.detail, name=’detail’) ,這樣在視圖函數(shù)里,第二個參數(shù)的名稱就隨便命名了。它根據(jù)位置參數(shù)的位置來匹配。
name
講name之前,先說說Django template的內(nèi)建標(biāo)簽url, {% url path.to.some_view%} 可以返回視圖函數(shù)對應(yīng)的URL(相對域名的絕對路徑),比如 url(r^/account/$’, views.index, name=index) ,使用 {% url view.index %} 將返回 /accout/ ,這樣做可以提高模版的靈活性,如果是使用硬編碼的方式,模版難以維護。
使用標(biāo)簽url的時候可能會遇到一個問題就是:對于:
urlpatterns = patterns('', url(r'^archive/(\d{4})/$', archive, name="full-archive"), url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}, "arch-summary"), )同一個視圖函數(shù)有多個urlconf,此時模版系統(tǒng)想通過視圖名 archive 獲取URL時,就不知所措了,name參數(shù)就是用來解決此問題的。name用來唯一區(qū)一個視圖對應(yīng)多個urlconf的場景。通過name來反向獲取URL。
如:
urlpatterns = patterns('', url(r'^archive/(\d{4})/$', archive, name="full-archive"), url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}, "arch-summary"), )在模版中可以使用:
{% url arch-summary 1945 %} {% url full-archive 2007 %}kwargs
kwargs就是一個字典類型的參數(shù),它的使用方式如:
url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}, "arch-summary"),這里的kwargs 就是 {‘summary’: True}
視圖函數(shù)中就是這樣使用:
def archive(request, archive_id, summary):
注意:
如果在url.py 中有 url(r'^comment/(\d{1,9})/delete/$','delete_comment'), 的配置,如果不存在 delete_comment 這樣一個函數(shù)視圖,如果在模版中使用了 {% url path.to.some_view %} 這個標(biāo)簽,那么拋出 ViewDoesNotExit錯誤。仔細想想很有道理,如果視圖不存在,即使匹配到了URL,當(dāng)訪問這個URL的時候,還是會拋ViewDoesNotExit的異常,這里Django只是在加載解析URLConf的時候就做了檢查。
如果在根url.py文件中使用了 url(r’^people/’, include(‘people.urls’, namespace=’people’)) ,這里people是一個app,那么在people這個app中的url.py中 url(r’^(\d{1,9})/$’,’index’, name=’index’) 必須指定了name=index才能正常使用{% url ‘people:index’%},否則:
NoReverseMatch at /
Reverse for ‘subjects’ with arguments ‘()’ and keyword arguments ‘{}’ not found
當(dāng)然如果你確定不是上述問題拋出的此異常,那么可以看下這兩個答案:
http://stackoverflow.com/questions/9649587/reverse-for-with-arguments-and-keyword-arguments-not-found
http://stackoverflow.com/questions/14882491/django-release-1-5-url-requires-a-non-empty-first-argument-the-syntax-change
本文參考
https://docs.djangoproject.com/en/1.1/topics/http/urls/#id2
https://docs.djangoproject.com/en/1.1/ref/templates/builtins/#std:templatetag-url
Django1.8返回json字符串和接收post的json字符串內(nèi)容 http://www.linuxidc.com/Linux/2015-07/120226.htm
如何使用 Docker 組件開發(fā) Django 項目? http://www.codesec.net/Linux/2015-07/119961.htm
Ubuntu Server 12.04 安裝Nginx+uWSGI+Django環(huán)境 http://www.codesec.net/Linux/2012-05/60639.htm
Django+Nginx+uWSGI 部署 http://www.codesec.net/Linux/2013-02/79862.htm
Django實戰(zhàn)教程 http://www.codesec.net/Linux/2013-09/90277.htm
Django python mysql Linux 開發(fā)環(huán)境搭建 http://www.codesec.net/Linux/2013-09/90638.htm
Django 的詳細介紹 :請點這里
Django 的下載地址 :請點這里
本文地址 : http://www.codesec.net/Linux/2015-08/121376.htm
本文開發(fā)(python)相關(guān)術(shù)語:python基礎(chǔ)教程 python多線程 web開發(fā)工程師 軟件開發(fā)工程師 軟件開發(fā)流程
總結(jié)
以上是生活随笔為你收集整理的Django url() 函数详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络时间协议服务器检测,NTP(网络时间
- 下一篇: mongotemplate 多表多条件查