django url 中的namespace詳解


引子

  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名存在、也不會有問題,因為命名空間可以隔離它們了。

 

----


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM