標籤:名稱 接受 路由 value 對象 int arch index 資料封裝
開始前,先上一張圖,讓理解Django內部的處理流程,我們可以知道Django內部使用MTV架構,那今天講的第一個部分就是控制器,在Tornado架構中叫做路由系統,負責把url映射到相應的處理邏輯上去,在Django裡是view處理,叫視圖,大概瞭解後,我接下來就去看看這個分發器怎麼實現以及怎麼使用吧
url模式與視圖函數的映射表
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^index/‘, views.index),]
為什麼是url模式,因為在url裡採用的是Regex進行一一映射的,通過Regex,你可以實現把多個相似的url映射到同一視圖函數來進行統計處理
url(Regex,view函數,參數,別名)
Regex靈活匹配你想要的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),]
這裡需要的注意的是,前端提交過來的資料封裝在請求對象裡,在定義視圖函數需要用一個參數接受這個對象,參數名任意命名,Regex中涉及到用組去捕獲的話,在視圖函數裡也要用參數去接受,有幾個組,就用多少個參數接收
比如下面是Regex裡有兩個組的
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‘)
另外Regex裡是支援指定組名的,如果Regex使用這個方式進行匹配,在視圖函數裡,接收參數的名稱就不能隨便起了,一定要是指定的組名
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 urlfrom django.contrib import adminfrom app01 import viewsfrom django.conf.urls import includeurlpatterns = [ 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 urlfrom . import viewsurlpatterns = [ 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 urlfrom . import viewsurlpatterns = [ 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 urlfrom django.contrib import adminfrom app01 import viewsfrom django.conf.urls import includeurlpatterns = [ 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 urlfrom . import viewsurlpatterns = [ #局部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系列