Django分發控制器urls--白話聊Django系列

來源:互聯網
上載者:User

標籤:名稱   接受   路由   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系列

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.