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:
1、 精確字符串格式:articles/2017/
一個精確URL匹配一個操作函數;最簡單的形式,適合對靜態URL的響應;URL字符串不以“/”開頭,但要以“/”結尾
2、 Django的轉換格式:<類型:變量名>,articles/<int:year>/
是一個URL模版,匹配URL同時在其中獲得一批變量作為參數;是一種常用形式,目的是通過URL進行參數獲取和傳遞
轉換格式類型 |
說明 |
Str |
匹配除分隔符(/)外的非空字符,默認類型<year>等價於<str:year> |
Int |
匹配0和正整數 |
Slug |
匹配字母、數字、橫杠、下划線組成的字符串,str的子集 |
Uuid |
匹配格式化的UUID,如075194d3-6885-417e-a8a8-6c931e272f00 |
path |
匹配任何非空字符串,包括路徑分隔符,是全集 |
3、 正則表達式格式: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的應用命名空間:
在多個app之間,有可能產生同名的url。這時候為了避免反轉url時產生混淆,可以使用應用命名空間,來區分。
定義應用命名空間只要在‘app’的'urls.py'中定義一個叫做;'app_name'的變量,來指定這個應用的命名空間即可。實例代碼如下:
app_name = 'app01' urlpatterns = [ path('login/',views.login,name='login'), ]
以后在做反轉的時候可以使用:'應用命名空間:url名稱'的方式進行反轉。實例代碼如下:
from django.shortcuts import redirect, reverse def login(request): login_url = reverse('app01:login') # 跳轉登錄頁面 return redirect(login_url)