Django2.0中URL的路由機制

Django2.0中URL的路由機制
路由是關聯url及其處理函數關係的過程。Django的url路由配置在settings.py文件中ROOT_URLCONF變量指定全局路由文件名稱。

Django的路由都寫在urls.py文件中的urlpatterns列表中,由path()或re_path()做爲元素組成。

Django的URL路由流程:

1  Django查找全局urlpatterns變量(urls.py)

2  按照前後順序,對URL逐一匹配urlpatterns每一個元素

3  找到第一個匹配時中止查找,根據匹配結果執行對應的處理函數。

4  若是沒有找到匹配或出現異常,Django進行錯誤處理

注意:

Django的路由不考慮HTTP請求方式,僅根據URL進行路由,即,只要URL相同,不管POST、GET等哪一種請求方式都指向同一個操做函數。

Urlpatterns中的path()處理字符串路由,re_path處理正則表達式路由。

其格式:

urlpatterns=[

    path(route,views.函數名,向處理函數提供的額外參數,以字典形式表示,該URL模式的別名),

re_path(正則表達式,view.對應的處理函數)

]

其中正則表達式能夠看作字符串的模式。

Django支持三種表達route:

一、       精確字符串格式:articles/2017/

一個精確URL匹配一個操做函數;最簡單的形式,適合對靜態URL的響應;URL字符串不以「/」開頭,但要以「/」結尾

二、       Django的轉換格式:<類型:變量名>,articles/<int:year>/

是一個URL模版,匹配URL同時在其中得到一批變量做爲參數;是一種經常使用形式,目的是經過URL進行參數獲取和傳遞

轉換格式類型html

說明正則表達式

Strdjango

匹配除分隔符(/)外的非空字符,默認類型<year>等價於<str:year>函數

Int網站

匹配0和正整數ui

Slugurl

匹配字母、數字、橫槓、下劃線組成的字符串,str的子集spa

Uuidcode

匹配格式化的UUID,如075194d3-6885-417e-a8a8-6c931e272f00htm

path

匹配任何非空字符串,包括路徑分隔符,是全集

 

三、       正則表達式格式:articles/(?p<year>[0-9]{4})/

藉助正則表達式豐富語法表達一類URL(而不是一個);能夠經過<>提取變量做爲處理函數的參數,高級用法;使用該方法時,前面不能使用path()函數,必須使用re_path()函數;表達的所有是str格式,不能是其餘類型。

兩種形式:不提取參數,好比re_path(articles/([0-9]{4}/,表示四位數字,每個數字都是0到9的任意數字;提取參數,命名形式(?P<name>pattern),好比re_path(articles/(?P<year>[0-9]{4})/,將正則表達式提取的四位數字,每個數字都是0到9的任意數字命名爲year,

當視圖函數路徑較多時,可使用Include()用法進行去重:

複製代碼
urlpatterns=[

path(‘<page_slug>-<page_id>/history/’,views.history),

path(‘<page_slug>-<page_id>/edit/’,views.edit),

]
複製代碼
 

等價於:

複製代碼
Urlpatterns = [

path(‘<page_slug>-<page_id>/’,include([

      path(‘history/’,views.history),

      path(‘edit/’,views.edit),

]
複製代碼
        當網站功能較多時能夠在該功能文件夾裏建一個urls.py文件,將該功能模塊下的url所有寫在該文件裏。可是要在全局的urls.py中使用include方法實現url映射分發。

例如:網站有論壇模塊,則在論壇模塊下建個urls.py文件,將與論壇相關的頁面的url所有寫在這個文件裏,而後在全局的urls.py文件裏這樣寫:

複製代碼
from django.urls import path,include

urlpatterns = [

    path('admin/', admin.site.urls),
    path('ant_test/',include('ant_test.urls'))
]

 

     在論壇模塊下的urls.py文件這樣寫:

from django.urls import path
urlpatterns = [

    path('news/',views.news),

   ]
 

       在views.py中寫對應的news函數便可。

  Django2.0版本中path(route,views.對應處理函數)等價於低版本的url(r'^route/$’,views.對應處理函數)

 

 

路由系統:URL

普通url:re_path('^index/',view.index),re_path('^home/',view.Home.as_view())
順序傳參:re_path(r'^detail-(\d+)-(\d+).html/',views.detail),這個用*args接收
關鍵字傳參:re_path(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html/',views.detail),這個用**kwargs接收,推薦使用這個
相關文章
相關標籤/搜索