1. 程式人生 > >Django之 URL

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/

。如果你想深入研究正則表示式,可以讀一些相關的書籍或專論,但是在Django的實踐中,你不需要多高深的正則表示式知識。效能註釋:正則表示式會進行預先編譯當URLconf模組載入的時候,因此它的匹配搜尋速度非常快,你通常感覺不到。
view:
當正則表示式匹配到某個條目時,自動將封裝的HttpRequest物件作為第一個引數,正則表示式“捕獲”到的值作為第二個引數,傳遞給該條目指定的檢視。如果是簡單捕獲,那麼捕獲值將作為一個位置引數進行傳遞,如果是命名捕獲,那麼將作為關鍵字引數進行傳遞。
kwargs:
任意數量的關鍵字引數可以作為一個字典傳遞給目標檢視。
name:
對你的URL進行命名,可以讓你能夠在Django的任意處,尤其是模板內顯式地引用它。相當於給URL取了個全域性變數名,你只需要修改這個全域性變數的值,在整個Django中引用它的地方也將同樣獲得改變。這是極為古老、樸素和有用的設計思想,而且這種思想無處不在。

  1. 按照順序放置的動態路由

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/"