Django學習筆記之url路由

2021-10-02 02:50:09 字數 4682 閱讀 8529

一、django中路由的作用:

​ 其本質是url與該url要呼叫的檢視函式之間的對映,就是為告訴django對客戶端發過來的某個url應該呼叫執行哪一段邏輯**

二、路由基本的配置:

from django.conf.urls import url

# urlpatterns必須是乙個由url()例項組成的python列表

urlpatterns =

[# url(regex, view, kwargs=none, name=none),

url(正規表示式, 檢視函式名, 可選引數, 路由別名),]

"""url()函式中的引數解釋:

正規表示式:乙個正規表示式字串

views檢視函式:乙個可呼叫物件,通常為乙個檢視函式或乙個指定檢視函式路徑的字串

引數:可選的要傳遞給檢視函式的預設引數(字典形式)

別名:乙個可選的name引數,用於反向解析

"""

三、細說url函式的第乙個引數:
from django.conf.urls import url

from

.import views

urlpatterns =

[ url(r'^articles/2003/$'

, views.special_case_2003)

, url(r'^articles/([0-9])/$'

, views.year_archive)

, url(r'^articles/([0-9])/([0-9])/$'

, views.month_archive)

, url(r'^articles/([0-9])/([0-9])/([0-9]+)/$'

, views.article_detail)

,]

注意點:urlpatterns列表中的元素按照書寫順序從上往下逐一匹配正規表示式,一旦匹配成功則不再繼續。

當請求匹配urlpatterns完所有元素後也未匹配成功,就會向客戶端返回404.

若要從url中捕獲乙個值,只需要在 / / 裡放置一對圓括號,並寫上對應的正則匹配即可(分組匹配)。

不需要新增乙個前導的反斜槓,因為每個url 預設前面就會有反斜槓。例如,應該是^articles 而不是 ^/articles。

每個正規表示式前面的』r』 是可選的但是建議加上。讓正則字串中任何字元都不被轉義,保留原始。

四、路由正規表示式結尾是否要加 『/』 說明:

from django.conf.urls import url

urlpatterns =

[ url(r'^index/$'

, views.index)

,# 結尾加'/'

url(r'^test$'

, views.test)

,# 結尾不加 '/'

]

例如:

​ 測試1:訪問或/ 結果都是成功的,因為當訪問時會自動做301重定向到/

​ 測試2:訪問是成功的, /就會失敗了

那麼到底是什麼原因?怎麼會這樣呢?

# 如路由中結尾有'/' 但請求中的url結尾沒有加'/'匹配時是否在url中附加尾部斜槓 true新增,false不新增

true

# django的global_settings的預設配置

由此測試可以說明在定義路由時結尾加上 '/ 』 會讓路由更加靈活。五、沒有命名的正規表示式組:

# 將加圓括號的正規表示式匹配到的內容當做位置引數自動傳遞給對應的檢視函式

# 路由層

url(r'^test/(\d+)/'

,views.test)

,# 匹配乙個或多個數字

# 檢視層

deftest

(request, num)

:# num接收到從路由括號圓括號內,相應正規表示式中匹配的值

)

六、有命名的正規表示式組:

​ 在python的正規表示式中,分組命名正規表示式組的語法是(?ppattern),其中name是組的名稱,pattern是要匹配的模式

# 將加圓括號的正規表示式匹配到的內容當做關鍵字引數自動傳遞給對應的檢視函式

# 路由層

url(r'^test/(?p\d+)/'

,views.test)

,# 匹配乙個或多個數字

# 檢視層

deftest

(request, year)

:# 此處的形參名一定要和正則組命名一致

)

下面是**是 使用有命名的正規表示式組重寫:

from django.conf.urls import url

from

.import views

urlpatterns =

[ url(r'^articles/2003/$'

, views.special_case_2003)

, url(r'^articles/(?p[0-9])/$'

, views.year_archive)

, url(r'^articles/(?p[0-9])/(?p[0-9])/$'

, views.month_archive)

, url(r'^articles/(?p[0-9])/(?p[0-9])/(?p[0-9])/$'

, views.article_detail)

,]

​ 這個實現與前面的示例完全相同,只有乙個細微的差別:捕獲的值作為關鍵字引數而不是位置引數傳遞給檢視函式。

​ 在實際應用中,使用有命名的正規表示式組會更加明晰且不容易產生引數順序問題的錯誤 —— 你可以在你的檢視函式定義中重新安排引數的順序。 當然,這些好處是以簡潔為代價的;一些開發人員發現命名組語法醜陋而且太冗長。

注意:

​ 無名正規表示式組和有名正規表示式組不能混著用!!!

# 要麼都不命名

url(r'^articles/([0-9])/([0-9])/$', views.month_archive),

# 要命名都要命名

url(r'^articles/(?p[0-9])/(?p[0-9])/$', views.month_archive),

# 不能這樣混著用,報錯提示缺少必傳位置引數

url(r'^articles/(?p[0-9])/([0-9])/$', views.month_archive),

七、正規表示式組捕獲的引數都是字串型別:

​ 每個捕獲的引數都作為乙個普通的python 字串傳遞給檢視,無論正規表示式使用的是什麼匹配方式。 例如,

url(r'^articles/(?p[0-9])/$'

, views.year_archive)

,

​ 傳遞給views.year_archive()year引數將是乙個字串,不是整數,即使[0-9]只匹配整數字串

八、指定檢視引數的預設值:

# urlconf

from django.conf.urls import url

from

.import views

urlpatterns =

[ url(r'^blog/$'

, views.page)

, url(r'^blog/page(?p[0-9]+)/$'

, views.page),]

# view (in blog/views.py)

defpage

(request, num=

"1")

:# 此處省略若干行**...

在上面的例子中:

​ 兩個url指向同乙個檢視views.page

​ 但是第乙個不會從url 中捕獲任何值。 如果第乙個匹配成功,page()函式中num將使用預設的引數值"1"

如果第二個模式匹配,`page()` 將使用正規表示式捕獲的`num` 值。
通過上面例子,你發現了什麼呢?

​ 說明我們檢視函式中的普通引數變為預設引數後,可以讓我們的檢視函式變的更靈活,這樣我們可以讓乙個檢視函式被多種路由去靈活使用。

Django學習筆記之URL標籤的使用

期初用django 開發應用的時候,完全是在urls.py 中硬編碼配置位址,在views.py中httpresponseredirect 也是硬編碼轉向位址,當然在template 中也是一樣了,這樣帶來乙個問題,如果在urls.py 中修改了某個頁面的位址,那麼所有的地方 views.py和te...

Django學習筆記之url路由及模板渲染方式

1.在專案目錄下urls.py檔案 2.在專案目錄建立了乙個views.py檔案 path 基本規則 path test views.test 使用尖括號 從url中捕獲值。包含乙個轉化器型別 converter type 沒有轉化器,將匹配任何字串,當然也包括了 字元 預設支援的轉換器 str,匹...

django學習筆記011 捕獲url引數

前面我們講到,django的mvt框架,在urls.py裡面利用正規表示式對http請求的url進行匹配,但是如何獲得http請求裡面的傳送的引數呢?利用正規表示式的分組進行獲取引數 url r books d views.detail d 為正規表示式裡面的組 獲取位置的引數,並傳給view裡面的...