Django之 URL
urlpatterns = [url(r'^admin/', admin.site.urls),]
url()函式可以傳遞4個引數,其中2個是必須的:regex和view,以及2個可選的引數:kwargs和name。下面是具體的解釋:
regex:
regex是正則表示式的通用縮寫,它是一種匹配字串或url地址的語法。Django拿著使用者請求的url地址,在urls.py檔案中對urlpatterns列表中的每一項條目從頭開始進行逐一對比,一旦遇到匹配項,立即執行該條目對映的檢視函式或二級路由,其後的條目將不再繼續匹配。因此,url路由的編寫順序至關重要!需要注意的是,regex不會去匹配GET或POST引數或域名,例如對於https://www.example.com/myapp/,regex只嘗試匹配myapp/。對於https://www.example.com/myapp/?page=3,regex也只嘗試匹配myapp/
view:
當正則表示式匹配到某個條目時,自動將封裝的HttpRequest物件作為第一個引數,正則表示式“捕獲”到的值作為第二個引數,傳遞給該條目指定的檢視。如果是簡單捕獲,那麼捕獲值將作為一個位置引數進行傳遞,如果是命名捕獲,那麼將作為關鍵字引數進行傳遞。
kwargs:
任意數量的關鍵字引數可以作為一個字典傳遞給目標檢視。
name:
對你的URL進行命名,可以讓你能夠在Django的任意處,尤其是模板內顯式地引用它。相當於給URL取了個全域性變數名,你只需要修改這個全域性變數的值,在整個Django中引用它的地方也將同樣獲得改變。這是極為古老、樸素和有用的設計思想,而且這種思想無處不在。
- 按照順序放置的動態路由
urlpatterns = [ url(r'^host/(\d+)$', views.host),
url(r'^host_list/(\d+)/(\d+)$', views.host_list), ]
\^host/(\d+)$ 相對應的url是: ”http://127.0.0.1/host/2“ (\d+)是匹配任意的數字,在分頁時靈活運用。
在views.host中需要指定一個形式引數來接受(\d+)\$ 的值
def user_list(request,id):
return HttpResponse(id)
\^host_list/(\d+)/(\d+)$ 相對應的url是: ”http://127.0.0.1/host/8/9“,匹配到的數字會以引數的形式按照順序傳遞給views裡面相對應的函式
在views.host_list中需要指定兩個形式引數,注意:此引數的順序嚴格按照url中匹配的順序
def user_list(request,hid,hid2):
return HttpResponse(hid+hid2)
2.傳參形勢的路由
利用正則表示式的分組方法,將url以引數的形式傳遞到函式,可以不按順序排列, 語法為: (?P<name>pattern), name 可以理解為所要傳遞的引數的名稱,pattern代表所要匹配的模式。
urlpatterns = [
url(r'^user_list/(?P<v1>\d+)/(?P<v2>\d+)$',views.user_list),
]
(?P<v1>\d+)
正則表示式的分組,相當於一個字典, key=v1, value=\d+。 {"v1":"\d+"}
然後將此引數傳遞到views裡對應的函式,可以不按照順序
def user_list(request,v2,v1):
return HttpResponse(v1+v2)
引數v1 = (?P<v1>\d+) 引數v2 = (?P<v2>\d+)
根據不同的app來分發不同的url
如果一個專案下有很多的app,那麼在urls.py裡面就要寫巨多的urls對映關係。這樣看起來很不靈活,而且雜亂無章。
我們可以根據不同的app來分類不同的url請求。
首先,在urls.py裡寫入urls對映條目。注意要匯入include方法
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),
]
這條關係的意思是將url為”app01/“的請求都交給app01下的urls去處理
其次,在app01下建立一個urls.py檔案,用來處理請求的url,使之與views建立對映
from django.conf.urls import include, url
from app01 import views
urlpatterns = [
url(r'index/$', views.index),
]
想對於url請求為: "http://127.0.0.1/app01/index/"