不使用命名空間,且兩個APP某條url使用相同的name屬性
app01_urls.py
1 urlpatterns = [ 2 url(r'aaa/$', views.app01_aaa, name="index"), 3 ]
app02_urls.py
1 urlpatterns = [ 2 url(r'aaa/$', views.app02_aaa, name="index"), 3 ]
各自的函數中同時反解URL
#app01.views def aaa(request): return HttpResponse(reverse("index")) #app02.views def aaa(request): return HttpResponse(reverse("index"))
頁面顯示結果app01.views
1 #app01 2 3 /app01aaa/ 4 5 6 #app02 7 8 /app01aaa/
總結
由於name沒有作用域,Django在反解URL時,會在項目全局順序搜索,當查找到第一個name指定URL時,立即返回
我們在開發項目時,會經常使用name屬性反解出URL,當不小心定義相同的name時,可能會導致URL反解錯誤,為了避免這種事情發生,引入了命名空間
解決
使用Django提供namespace參數
使用命名空間
app.urls必須添加變量
1 app_name = 'app01'
project_urls.py
from django.conf.urls import url,include urlpatterns = [ url(r'^aaa', include("app01.urls"),namespace='aaa')), url(r'^bbb', include("app02.urls"),namespace='bbb')), ]
app01_urls.py
from django.conf.urls import url from app01 import views app_name = "app01" urlpatterns = [ url(r'aaa/$', views.aaa, name="index"), ]
app02_urls.py
from django.conf.urls import url from app01 import views app_name = "app02" urlpatterns = [ url(r'aaa/$', views.aaa, name="index"), ]
app01_views.py
def aaa(request): return HttpResponse(reverse("app01:index"))
app02_views.py
def aaa(request): return HttpResponse(reverse("app02:index"))
驗證
1 #http://127.0.0.1/aaa/aaa/ 2 3 # 結果: 4 # /aaaaaa/ 5 6 7 #http://127.0.0.1/bbb/aaa/ 8 9 # 結果: 10 # /bbbaaa/