Django基礎二之URL路由系統

2022-08-28 17:42:09 字數 4384 閱讀 2588

**基本格式 **

from django.conf.urls import url

#迴圈urlpatterns,找到對應的函式執行,匹配上乙個路徑就找到對應的函式執行,就不再往下迴圈了,並給函式傳乙個引數request,就是請求資訊的所有內容

urlpatterns = [

url(正規表示式, views檢視函式,引數,別名),

]

引數說明基本配置

from django.conf.urls import url

from . import views

urlpatterns = [

url(r'^articles/2003/$', views.special_case_2003), #思考:如果使用者想看2004、2005、2006....等,你要寫一堆的url嗎,是不是在articles後面寫乙個正規表示式/d/就行啦,**裡面輸入127.0.0.1:8000/articles/1999/試一下看看

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

url(r'^articles/([0-9])/([0-9])/$', views.month_archive), #思考,如果你想拿到使用者輸入的什麼年份,並通過這個年份去資料庫裡面匹配對應年份的文章,你怎麼辦?怎麼獲取使用者輸入的年份啊,分組/(\d)/,乙個小括號搞定

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

]

views.py中檢視函式的寫法:

第乙個引數必須是request,後面跟的三個引數是對應著上面分組正則匹配的每個引數的

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

若要從url中捕獲乙個值,只需要在它周圍放置一對圓括號(分組匹配)。

不需要新增乙個前導的反斜槓(也就是寫在正則最前面的那個/),因為每個url 都有。例如,應該是^articles 而不是 ^/articles。

每個正規表示式前面的'r' 是可選的但是建議加上。

^articles& 以什麼結尾,以什麼開頭,嚴格限制路徑

補充說明

# 是否開啟url訪問位址後面不為/跳轉至帶有/的路徑的配置項
from django.conf.urls import url

urlpatterns = [

url(r'^blog/$', views.blog),

]

訪問 時,預設將**自動轉換為 。

​在上述基本配置示例中,使用了簡單的正規表示式分組匹配來捕獲url中的值並以位置引數的形式傳遞給檢視,例如url(r'^articles/([0-9])/([0-9])/$', views.month_archive)。而更高階的用法是,使用分組命名正規表示式組來捕獲url中的值並以關鍵字引數的形式傳遞給檢視。

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

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),

]

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

views.month_archive(request, year="2017", month="12"),year和month的位置可以換,沒所謂了,因為是按照名字來取資料的
urlconf匹配的位置**

urlconf 在請求的url 上查詢,將它當做乙個普通的python 字串。不包括get和post引數以及網域名稱。

urlconf 不檢查請求的方法。換句話講,所有的請求方法 —— 同乙個url的postgethead等等 —— 都將路由到相同的函式。

捕獲的引數永遠都是字串

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

url(r'^articles/(?p[0-9])/$', views.year_archive),
傳遞到檢視函式views.year_archive()中的year引數永遠是乙個字串型別。

專案名下面的urls.py不再做路由與檢視函式對應關係

那麼反向解析的時候會怎麼樣,django能不能幫你自動識別出來呢?

結果是不行,他還沒有智慧型到區分到那個應用上,所以有兩種方式來解決:

### 方式

一、命名空間**

from django.conf.urls import url,include

urlpatterns = [

url(r'^admin/', admin.site.urls),

]

現在就相當於給他們搞了個命名空間,我們在解析的時候:

通常情況下,起別名的時候,前面可以加上你的應用名,因為應用是不可能會重名的,所以只需要在你起別名的時候,在前面加上應用名就好了。

urlpatterns = [

url(r'^admin/', admin.site.urls),

]

這個時候就永遠也不會重名了,除非有程式設計師不遵守這種規則。

咱們簡單來說就是可以給我們的url匹配規則起個名字,乙個url匹配模式起乙個名字。

這樣我們以後就不需要寫死url**了,只需要通過名字來呼叫當前的url。

舉個簡單的例子:

url(r'^home', views.home, name='home'),  # 給我的url匹配模式起名(別名)為 home,別名不需要改,路徑你就可以隨便改了,別的地方使用這個路徑,就用別名來搞

url(r'^index/(\d*)', views.index, name='index'), # 給我的url匹配模式起名為index

在模板裡面可以這樣引用:

#模板渲染的時候,被django解析成了這個名字對應的那個url,這個過程叫做反向解析
在views函式中可以這樣引用

from django.urls import reverse   #導如reverse方法

reverse("index", args=("2018", ))

在views函式中可以這樣引用

from django.urls import reverse

reverse("index", args=("2018", ))

Django的URL路由基礎

隨便新建個django專案,缺省會自動建立乙個 project name urls.py檔案,並自動包含一些內容,這就是專案的根url。如果要自己編寫url路由,基本也是這個套路。當使用者請求乙個頁面時,django根據下面的邏輯執行操作 1 決定要使用的根urlconf模組。通俗地講,就是你可以自...

Django之(URL)路由系統

簡而言之,django的路由系統作用就是使views裡面處理資料的函式與請求的url建立對映關係。使請求到來之後,根據urls.py裡的關係條目,去查詢到與請求對應的處理方法,從而返回給客戶端http頁面資料 django 專案中的url規則定義放在project 的urls.py目錄下,預設如下 ...

Django學習筆記之url路由

一 django中路由的作用 其本質是url與該url要呼叫的檢視函式之間的對映,就是為告訴django對客戶端發過來的某個url應該呼叫執行哪一段邏輯 二 路由基本的配置 from django.conf.urls import url urlpatterns必須是乙個由url 例項組成的pyth...