更新時(shí)間:2021年03月10日16時(shí)59分 來源:傳智教育 瀏覽次數(shù):
Django中路由的作用:
其本質(zhì)是URL與該URL要調(diào)用的視圖函數(shù)之間的映射,就是為告訴Django對客戶端發(fā)過來的某個(gè)URL應(yīng)該調(diào)用執(zhí)行哪一段邏輯代碼
路由基本的配置:
from django.conf.urls import url # urlpatterns必須是一個(gè)由url()實(shí)例組成的Python列表 urlpatterns = [ # url(regex, view, kwargs=None, name=None), url(正則表達(dá)式, 視圖函數(shù)名, 可選參數(shù), 路由別名), ] """ url()函數(shù)中的參數(shù)解釋: 正則表達(dá)式:一個(gè)正則表達(dá)式字符串 views視圖函數(shù):一個(gè)可調(diào)用對象,通常為一個(gè)視圖函數(shù)或一個(gè)指定視圖函數(shù)路徑的字符串 參數(shù):可選的要傳遞給視圖函數(shù)的默認(rèn)參數(shù)(字典形式) 別名:一個(gè)可選的name參數(shù),用于反向解析 """
細(xì)說url函數(shù)的第一個(gè)參數(shù):
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ]
==注意點(diǎn):==
路由正則表達(dá)式結(jié)尾是否要加 '/' 說明:
from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/$', views.index), # 結(jié)尾加'/' url(r'^test$', views.test), # 結(jié)尾不加 '/' ]
例如:
測試1:訪問http://127.0.0.1:8000/index或http://127.0.0.1:8000/index/ 結(jié)果都是成功的,因?yàn)楫?dāng)訪問http://127.0.0.1:8000/index時(shí)會(huì)自動(dòng)做301重定向到http://127.0.0.1:8000/index/
測試2:訪問http://127.0.0.1:8000/test是成功的, http://127.0.0.1:8000/test/就會(huì)失敗了
那么到底是什么原因?怎么會(huì)這樣呢?
# 如路由中結(jié)尾有'/' 但請求中的url結(jié)尾沒有加'/'匹配時(shí)是否在URL中附加尾部斜杠 True添加,F(xiàn)alse不添加 APPEND_SLASH=True # Django的global_settings的默認(rèn)配置
測試1中:http://127.0.0.1:8000/index寫法也能訪問成功的原因就是APPEND_SLASH默認(rèn)設(shè)置了為True,但是如果把此配置改為False,那么訪問 r'^index/$' 路由時(shí)就必須在結(jié)尾的加上'/'。
總結(jié):
由此測試可以說明在定義路由時(shí)結(jié)尾加上 '/ ' 會(huì)讓路由更加靈活。
沒有命名的正則表達(dá)式組:
# 將加圓括號(hào)的正則表達(dá)式匹配到的內(nèi)容當(dāng)做位置參數(shù)自動(dòng)傳遞給對應(yīng)的視圖函數(shù) # 路由層 url(r'^test/(\d+)/',views.test), # 匹配一個(gè)或多個(gè)數(shù)字 # 視圖層 def test(request, num): # num接收到從路由括號(hào)圓括號(hào)內(nèi),相應(yīng)正則表達(dá)式中匹配的值 print(num) return HttpResponse('test')
有命名的正則表達(dá)式組:
在Python的正則表達(dá)式中,分組命名正則表達(dá)式組的語法是(?P<name>pattern)
,其中name
是組的名稱,pattern
是要匹配的模式
# 將加圓括號(hào)的正則表達(dá)式匹配到的內(nèi)容當(dāng)做關(guān)鍵字參數(shù)自動(dòng)傳遞給對應(yīng)的視圖函數(shù) # 路由層 url(r'^test/(?P<year>\d+)/',views.test), # 匹配一個(gè)或多個(gè)數(shù)字 # 視圖層 def test(request, year): # 此處的形參名一定要和正則組命名一致 print(year) return HttpResponse('test')
下面是代碼是 使用有命名的正則表達(dá)式組重寫:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail), ]
這個(gè)實(shí)現(xiàn)與前面的示例完全相同,只有一個(gè)細(xì)微的差別:捕獲的值作為關(guān)鍵字參數(shù)而不是位置參數(shù)傳遞給視圖函數(shù)。
在實(shí)際應(yīng)用中,使用有命名的正則表達(dá)式組會(huì)更加明晰且不容易產(chǎn)生參數(shù)順序問題的錯(cuò)誤 —— 你可以在你的視圖函數(shù)定義中重新安排參數(shù)的順序。 當(dāng)然,這些好處是以簡潔為代價(jià)的;一些開發(fā)人員發(fā)現(xiàn)命名組語法丑陋而且太冗長。
注意:
無名正則表達(dá)式組和有名正則表達(dá)式組不能混著用?。?!# 要么都不命名
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), # 要命名都要命名 url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), # 不能這樣混著用,報(bào)錯(cuò)提示缺少必傳位置參數(shù) url(r'^articles/(?P<year>[0-9]{4})/([0-9]{2})/$', views.month_archive),
正則表達(dá)式組捕獲的參數(shù)都是字符串類型:
每個(gè)捕獲的參數(shù)都作為一個(gè)普通的Python 字符串傳遞給視圖,無論正則表達(dá)式使用的是什么匹配方式。 例如,
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
傳遞給views.year_archive()
的year
參數(shù)將是一個(gè)字符串,不是整數(shù),即使[0-9]{4}
只匹配整數(shù)字符串
指定視圖參數(shù)的默認(rèn)值:
在這里給大家說一個(gè)方便的小技巧是指定視圖參數(shù)的默認(rèn)值。 URLconf 和視圖的示例:
# URLconf from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/$', views.page), url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ] # View (in blog/views.py) def page(request, num="1"): # 此處省略若干行代碼...
在上面的例子中:
兩個(gè)URL指向同一個(gè)視圖views.page
但是第一個(gè)不會(huì)從URL 中捕獲任何值。 如果第一個(gè)匹配成功,page()
函數(shù)中num
將使用默認(rèn)的參數(shù)值"1"
。
如果第二個(gè)模式匹配,`page()` 將使用正則表達(dá)式捕獲的`num` 值。
通過上面例子,你發(fā)現(xiàn)了什么呢?
說明我們視圖函數(shù)中的普通參數(shù)變?yōu)槟J(rèn)參數(shù)后,可以讓我們的視圖函數(shù)變的更靈活,這樣我們可以讓一個(gè)視圖函數(shù)被多種路由去靈活使用。
猜你喜歡
學(xué)會(huì)python可以做什么?這些好處你想象不到
Python常見異常類型詳細(xì)介紹
2021-03-03TCP和UDP的優(yōu)缺點(diǎn)|TCP和UDP的優(yōu)缺點(diǎn)對比
2021-02-26HTTP通信機(jī)制中的一次完整通信過程的7個(gè)步驟
2021-02-26什么是孤兒進(jìn)程和僵尸進(jìn)程?如何避免僵尸進(jìn)程?
2021-02-26Python實(shí)戰(zhàn)開發(fā)項(xiàng)目視頻教程:美多商城開發(fā)實(shí)戰(zhàn)【傳智教育】
2021-02-22NumPy數(shù)組有幾種創(chuàng)建方法?
2021-02-03北京校區(qū)