1、路由轉發函數
在實際開發過程中,一個django 項目會包含很多的 app ,這時候如果我們隻在主路由裡進行配置就會顯得雜亂無章,是以通常會在每個 app 裡,建立各自的 urls.py 路由子產品,然後從根路由出發,将 app 所屬的 url 請求,全部轉發到相應的 urls.py 子產品中。而這個從主路由轉發到各個應用路由的過程叫做路由的分發,而它的實作是使用include() 函數來完成的,如下所示:
from django.urls import path,include
from bookstore import views
urlpatterns = [path('index/',include('index.urls'))]
從主路由的 urls.py 中使用 include 函數将其關聯到 index 應用的路由子產品。
2、命名空間namespace
我們知道一個 django 項目中可以建立多個應用,每個應用又可以定義很多的視圖函數,是以就會有很多的 url 路由映射(簡稱 url 模式),在這種情況下給 url 命名就難免會發生命名沖突, django 為了解決這一問題,為開發者提供了命名空間功能即 namespace。url 命名空間使得即使在不同的應用(app)中定義了相同的 url 名稱,也能夠正确的實作 url 反向解析。
url 命名空間分為兩個部分:第一,應用命名空間即使用 app_name 關聯應用名字;第二,使用 namespace 用來辨別一個應用的執行個體,主要功能是區分同一個應用中不同的執行個體。
下面為了讓大家更好的理命名空間的概念,我們對本節的示例進行改寫,首先在主路由 bookstore/urls.py 的 url 模式清單中,使用 namespace 參數給 index 應用添加命名空間。如下所示:
urlpatterns = [
path('index/',include('index.urls',namespace='first'))
]
在 index 應用的 urls.py 中添加(若之前已經添加則無需再重新添加)如下所示:
app_name="index"
最後改寫 index 應用的<code>test_to_reverse()</code>視圖函數,如下所示:
def test_to_reverse(request):
return httpresponseredirect(reverse
('index:detail_hello',current_app=request.resolver_match.namespace))
經過上面的設定我們就完成了 index 應用的命名空間操作,這樣即使是不同的應用存在相同 url 名稱,django 也能精準的解析我們想要的 url 路徑。