【引子】
django是一個比較全能的web框架,比如它實現了自己的orm模型來對接不同的數據庫、並提供了方便的數據接口;django牛逼的地方
還有許多,如他實現了自己的模板語言,這樣我們就能方便的做出數據驅動的動態網站;引入了app的概念而且app是可插拔的,這樣代碼
的復用級別就更高了,不在是function級別或class級別。django的app是可以自由分發的、假設我寫好了一個博客功能的app,你只要把這
這app引入到你的網站,那么你的網站就有博客功能了。
方便是不假、但是還是有一些要注意的地方、假設我的博客app中定義了一個叫“create”的url,如果你自己的app也定義一個叫“create”的
url就會引起沖突了
面對上面的問題一種可選的解決方案就是把url的名字起的盡可能的唯一、然而最好的解決方案就是引入“命名空間”為每一個app定義
一個“命名空間”,通過“命名空間”來區分url
【1、看一下沒有引入命名空間的情況】
在這個例子中我會定義兩個app分別叫app001、app002 每一個app都有自己的一個頁面,由於我們app比較簡單一個app就只有一個頁面,
我想把這個頁面的url名字叫“main-page”,但是兩個app都有一個叫“main-page”的頁面就會引起沖突,所以我為了避免這件事情的發生
我還要給不同的app中的“main-page”加上一個唯一的后綴。搞定之后整個項目看起來就像這樣
整個項目看起來就像上面的圖像一樣了
app001的關鍵內容如下:
app001/view.py
from django.shortcuts import render from django.http import Http404,HttpResponse def main_page(request): return render(request,"app001/main-page.html")
app001/urls.py
from django.urls import path from . import views #app_name="app001" urlpatterns = [ path('', views.main_page,name="main-page-xxx"), ]
app001/templates/app001/main-page.html
<!DOCTYPE html> <html> <head> <title>app001 的主頁</title> </head> <body> <h1>app001</h1> <a href="{% url 'main-page-xxx'%}">去往app001的主頁</a> </body> </html>
app002的關鍵內容如下:
app002/view.py
from django.shortcuts import render # Create your views here. def main_page(request): """ main_page function in app002 """ return render(request,'app002/main-page.html')
app002/urls.py
from django.urls import path from . import views #app_name="app002" urlpatterns = [ path('', views.main_page,name="main-page-yyy"), ]
app002/templates/app002/main-page.html
<!DOCTYPE html> <html> <head> <title>app02的主頁</title> </head> <body> <h1>app002的主頁</h1> <a href="{% url 'main-page-yyy'%}">app002 main page</a> </body> </html>
在template中為了防止硬編碼url路徑,我使用了{% url 'url-name' %}來生成url,這個也是django的推薦使用習慣,為了防止url的名子重復
我在第一個app里把“main-page”加上了后綴“xxx”,第二個里加上了“yyy”。這樣做使得url的名字變長了不少,而且多出來的部分並沒有特別
的字句意義。
【2、引入命名空間】
命名空間的引入並不要做多少工作,只要在usrl.py文件中加一個“app_name”就可以了,在加入命名空間后模板中就可以直接通過命名空間來
引用url了,下面以app001引入命名空間為例
from django.urls import path from . import views app_name="app001" #引入命名空間、命名空間的名字最好和app的名字相同 urlpatterns = [ path('', views.main_page,name="main-page"), ]
引入名字空間之后就可以根據命名空間來引用url了
<!DOCTYPE html> <html> <head> <title>app001 的主頁</title> </head> <body> <h1>app001</h1> <a href="{% url 'app001:main-page'%}">去往app001的主頁</a> </body> </html>
總結:
引入命名空間后就算有相同的url名存在、也不會有問題,因為命名空間可以隔離它們了。
----