1. 程式人生 > >Django分發控制器urls--白話聊Django系列

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

char pre ado .site 路由分發 esp one 部分 charset

技術分享

  開始前,先上一張圖,讓理解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系列