Django路由系統


django路由系統

 

簡而言之,django的路由系統作用就是使views里面處理數據的函數與請求的url建立映射關系。使請求到來之后,根據urls.py里的關系條目,去查找到與請求對應的處理方法,從而返回給客戶端http頁面數據。

 

 

 

一、最基礎的url映射

urls.py

1 from django.conf.urls import include, url 2 from django.contrib import admin 3 from app01 import views 4 5 urlpatterns = [ 6 url(r'^admin/', admin.site.urls), 7 url(r'^index/$', views.index),
8   ]

1、先從創建的app下的views.py面定義處理數據的函數

2、在urls.py里導入views

3、在urlpatterns里寫入一條url與處理函數的l映射關系

4、url映射一般是一條正則表達式,“^” 字符串的開始,“$“ 字符串的結束

5、當寫成”^$“時,不輸入任何url時不會在返回黃頁,而是返回后面函數里對應的頁面。一般這一條會寫在url的最后。如:

1 url(r'^$', views.index),

 

 

二、按照順序放置的動態路由

1 urlpatterns = [ 2 url(r'^user/(\d+)$', views.user), 3 url(r'^user_list/(\d+)/(\d+)$', views.user_list), 4 5 ]

^user/(\d+)$
相對應的url是: ”http://127.0.0.1/uer/8“ (\d+)是匹配任意的數字,在分頁時靈活運用。

 

^user_list/(\d+)/(\d+)$

相對應的url是: ”http://127.0.0.1/uer/8/9“,匹配到的數字會以參數的形式按照順序傳遞給views里面相對應的函數

1 def user_list(request,nid,nid2): 2 3 return HttpResponse(nid+nid2)

 

三、傳參形式的動態路由

利用正則表達式的分組方法,將url以參數的形式傳遞到函數,可以不按順序排列。

1 urlpatterns = [ 2 3 url(r'^user_list/(?P<v1>\d+)/(?P<v2>\d+)$',views.user_list), 4 5 ]

(?P<v1>\d+)

正則表達式的分組,相當於一個字典, key=v1, value=\d+。 {"v1":"\d+"}

然后將此參數傳遞到views里對應的函數,可以不按照順序

1 def user_list(request,v2,v1): 2 3 return HttpResponse(v1+v2)

參數v1 = (?P<v1>\d+)

參數v2 = (?P<v2>\d+)

 

 

四、根據不同的app來分發不同的url


如果一個項目下有很多的app,那么在urls.py里面就要寫巨多的urls映射關系。這樣看起來很不靈活,而且雜亂無章。

我們可以根據不同的app來分類不同的url請求。

首先,在urls.py里寫入urls映射條目。注意要導入include方法

1 from django.conf.urls import include, url 2 from django.contrib import admin 3 4 urlpatterns = [ 5 6 url(r'^app01/', include('app01.urls')), 7 8 ]

這條關系的意思是將url為”app01/“的請求都交給app01下的urls去處理

其次,在app01下創建一個urls.py文件,用來處理請求的url,使之與views建立映射

1 from django.conf.urls import include, url 2 from app01 import views 3 4 urlpatterns = [ 5 6 url(r'index/$', views.index), 7 8 ]

想對於url請求為:  "http://127.0.0.1/app01/index/"

 

 

 

五、通過反射機制,為django開發一套動態的路由系統

在urls.py里定義分類正則表達式

 1 from django.conf.urls import patterns, include, url  2 from django.contrib import admin  3 from DynamicRouter.activator import process  4  5 urlpatterns = patterns('',  6 # Examples:  7 # url(r'^$', 'DynamicRouter.views.home', name='home'),  8 # url(r'^blog/', include('blog.urls')),  9 10 url(r'^admin/', include(admin.site.urls)), 11 12 13 ('^(?P<app>(\w+))/(?P<function>(\w+))/(?P<page>(\d+))/(?P<id>(\d+))/$',process), 14 ('^(?P<app>(\w+))/(?P<function>(\w+))/(?P<id>(\d+))/$',process), 15 ('^(?P<app>(\w+))/(?P<function>(\w+))/$',process), 16 ('^(?P<app>(\w+))/$',process,{'function':'index'}), 17 )

 

在同目錄下創建activater.py

#!/usr/bin/env python #coding:utf-8 from django.shortcuts import render_to_response,HttpResponse,redirect def process(request,**kwargs): '''接收所有匹配url的請求,根據請求url中的參數,通過反射動態指定view中的方法''' app = kwargs.get('app',None) function = kwargs.get('function',None) try: appObj = __import__("%s.views" %app) viewObj = getattr(appObj, 'views') funcObj = getattr(viewObj, function) #執行view.py中的函數,並獲取其返回值 result = funcObj(request,kwargs) except (ImportError,AttributeError),e: #導入失敗時,自定義404錯誤 return HttpResponse('404 Not Found') except Exception,e: #代碼執行異常時,自動跳轉到指定頁面 return redirect('/app01/index/') return result 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM