Django路由分發與名稱空間的概念
阿新 • • 發佈:2022-03-01
路由分發
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')
]