1. 程式人生 > 其它 >Django路由分發與名稱空間的概念

Django路由分發與名稱空間的概念

路由分發

django每一個應用都可以擁有自己的templates資料夾 urls.py static資料夾
基於這個特點:django能夠非常好的做到分組開發(每個人只寫自己的app)

作為組長:只需要將手下書寫的app全部拷貝到一個新的django專案中,然後再配置檔案裡面註冊所有的app再利用路由分發的特點將所有的app整合起來

當一個django專案中的url特別多的時候,總路由urls.py程式碼非常冗餘不好維護
這個時候也可以利用路由分發來減輕總路由的壓力

具體使用

引子:

利用路由分發之後,總路由不再做路由與檢視函式的直接對應關係,而是做一個分發處理
識別當前url是屬於那個應用下的,直接分發給對應的應用去處理。
#  在建立應用時:需要自己手動給應用建立urls.py檔案

總路由:

from django.conf.urls import url,include
from django.contrib import admin
from app01 import urls as app01_urls   # 再匯入應用的urls模組時因為名字相同產生衝突可使用as語法起別名
from app02 import urls as app02_urls

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    # 路由分發方式一(必須匯入子路由):
    url(r'^app01/',include(app01_urls)),  # url字首是app01打頭 全部交給app01處理
    url(r'^app02/',include(app02_urls)),  # url字首是app02打頭 全部交給app02處理

    # 終極寫法(無需匯入模組):
    url(r'^app01/',include('app01.urls')),  # 注:這裡的正則千萬不能加$符號,如果加了到'/'就結束了 不會再去子路由裡面找字尾路由進行匹配。
    url(r'^app02/',include('app02.urls'))
]
# 終極寫法無需匯入子路由過來,也無需給子路由起別名,減少程式碼編寫提升效率。

子路由app01:

from django.conf.urls import url
from app01 import views


urlpatterns = [
    url(r'^reg/',views.reg)
]

# views.py
def reg(request):
    return HttpResponse('app01 reg')

子路由app02:

from django.conf.urls import url
from app02 import views


urlpatterns = [
    url(r'^reg/',views.reg)
]ss

# views.py
def reg(request):
    return HttpResponse('app02 reg')
# 這就相當於:識別到路由是app01/字首時,就會去子路由app01裡找app01自己的urls.py(app01_urls),然後會根據子路由與檢視函式的直接對應關係進行匹配

名稱空間

引子:

# 研究:當多個應用反向解析時出現了相同的路由別名 我們研究反向解析會不會自動識別對應的應用字首
# 總路由 urls.py
    url(r'^app01/',include('app01.urls',)),
    url(r'^app02/',include('app02.urls'))

# app01 urls.py
from app01 import views
urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
]

# app02 urls.py
from app02 import views
urlpatterns = [
    url(r'reg/',views.reg,name='reg')   # 使用相同的別名
]

# app01 views.py
def reg(request):
    print(reverse('reg'))
    return HttpResponse('reg app01')

# app02 views.py
def reg(request):
    print(reverse('reg'))
    return HttpResponse('reg app02')
# 我們可以看到:正常情況下的反向解析是沒有辦法自動識別字首的

使用名稱空間解決:

# 總路由
    url(r'^app01/',include('app01.urls',namespace='app01')),
    url(r'^app02/',include('app02.urls',namespace='app02'))
# 解析的時候
  	# app01 urls.py 
  	urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
		]
    # app02 urls.py
    urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
		]
# 後端解析
  	reverse('app01:reg')
    reverse('app02:reg')
# 前端解析:   
{% url 'app01:reg' %}
{% url 'app02:reg' %}

補充:

# 其實只要保證名字不衝突 就沒有必要使用名稱空間
"""
一般情況下 有多個app的時候我們在起別名的時候會加上app的字首
這樣的話就能夠確保多個app之間名字不衝突的問題
"""
urlpatterns = [
    url(r'^reg/',views.reg,name='app01_reg')
]
urlpatterns = [
    url(r'^reg/',views.reg,name='app02_reg')
]