天天看點

19路由(一)

 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 路徑。