Django分發控制器urls--白話聊Django系列
開始前,先上一張圖,讓理解Django內部的處理流程,從圖中我們可以知道Django內部使用MTV架構,那今天講的第一個部分就是控制器,在Tornado框架中叫做路由系統,負責把url映射到相應的處理邏輯上去,在Django裏是view處理,叫視圖,大概了解後,我接下來就去看看這個分發器怎麽實現以及怎麽使用吧
url模式與視圖函數的映射表
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^index/‘, views.index), ]
為什麽是url模式,因為在url裏采用的是正則表達式進行一一映射的,通過正則表達式,你可以實現把多個相似的url映射到同一視圖函數來進行統計處理
url(正則表達式,view函數,參數,別名)
正則表達式靈活匹配你想要的url
urlpatterns = [ url(r‘^articles/2003/$‘, views.special_case_2003), url(r‘^articles/([0-9]{4})/$‘, views.year_archive), url(r‘^articles/([0-9]{4})/([0-9]{2})/$‘, views.month_archive), url(r‘^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$‘, views.article_detail), ]
這裏需要的註意的是,前端提交過來的數據封裝在請求對象裏,在定義視圖函數需要用一個參數接受這個對象,參數名任意命名,正則表達式中涉及到用組去捕獲的話,在視圖函數裏也要用參數去接受,有幾個組,就用多少個參數接收
比如下面是正則表達式裏有兩個組的
def index(req,num,num2): print(num) print(num2) if req.method == "POST": name = req.POST.get(‘Name‘,None) pwd = req.POST.get(‘Pwd‘,None) print(name,pwd) return HttpResponse(‘success‘) return render(req,‘index.html‘)
另外正則表達式裏是支持指定組名的,如果正則表達式使用這個方式進行匹配,在視圖函數裏,接收參數的名稱就不能隨便起了,一定要是指定的組名
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^index/(?P<n1>\d)(?P<n2>\d)‘, views.index), ] def index(req,n1,n2): print(n1) print(n2) if req.method == "POST": name = req.POST.get(‘Name‘,None) pwd = req.POST.get(‘Pwd‘,None) print(name,pwd) return HttpResponse(‘success‘) return render(req,‘index.html‘)
第二參數,不僅可以傳入views裏的視圖函數,還可以傳入include實現app的路由分發,從而實現松耦合的作用,一家大點的公司下面會有多個業務的,一般會按業務板塊分成多個app
,為能url不相幹擾,就可以這樣進行路由映射
實現路由分發三步走:
第一步,在之前的url文件導入include,加入分發映射關系
from django.conf.urls import url from django.contrib import admin from app01 import views from django.conf.urls import include urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^index/(?P<n1>\d)(?P<n2>\d)‘, views.index), #這裏實現路由分發 url(r‘^car/‘, include(‘app01.urls‘)), ]
第二步,在app下創建一個urls.py文件,加入url與視圖函數映射關系
from django.conf.urls import url from . import views urlpatterns = [ url(‘buy/(?P<year>\d{4})(?P<month>\d)‘,views.home) ]
第三步,定義視圖函數
def home(req,year,month): print(year) print(month) return HttpResponse(‘ok‘)
直接訪問http://127.0.0.1:8000/car/buy/12345就可以了
第三參數:可以以字典的方式傳值傳給視圖函數,視圖函數必須要有參數接收
from django.conf.urls import url from . import views urlpatterns = [ url(‘buy/(?P<year>\d{4})(?P<month>\d)‘,views.home,{‘foo‘:‘bar‘}) ]
def home(req,year,month,foo): print(foo) print(year) print(month) return HttpResponse(‘ok‘)
如果在app的url映射關系加了這個參數,只是對當前的url起作用,如果在路由分發加入這個參數,則是整個app下的url起作用,這個參數你用在 針對url實現不同要求,比如不同的url可能要實現連接不同的數據庫,這個可以傳個操作句柄,或者不同url實現怎樣的緩存
from django.conf.urls import url from django.contrib import admin from app01 import views from django.conf.urls import include urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^index/(?P<n1>\d)(?P<n2>\d)‘, views.index), #全局f url(r‘^car/‘, include(‘app01.urls‘),{‘f‘:‘f‘}), ]
from django.conf.urls import url from . import views urlpatterns = [ #局部foo url(‘buy/(?P<year>\d{4})(?P<month>\d)‘,views.home,{‘foo‘:‘bar‘}), url(‘money‘,views.money), ]
def home(req,year,month,foo,f): print(f) print(foo) print(year) print(month) return HttpResponse(‘ok‘) def money(req,f): print(f) return HttpResponse(‘ok‘)
第四參數:別名,當url發生變化的時候,前端通過別名進行post數據,照樣能訪問同樣的內容,進入到同樣的邏輯
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="{% url ‘BIEMING‘ %}" method="post"> 用戶名:<input type="text" name="username"> 密碼:<input type="password" name="password"> <input type="submit" value="提交"> </form> </body> </html>
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^index/(?P<n1>\d)(?P<n2>\d)‘, views.index), url(r‘^bieming‘, views.bieming,name=‘BIEMING‘), #全局f url(r‘^car/‘, include(‘app01.urls‘),{‘f‘:‘f‘}), ]
Django分發控制器urls--白話聊Django系列