1、路由转发函数

在实际开发过程中,一个Django 项目会包含很多的 app ,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个 app 里,创建各自的 urls.py 路由模块,然后从根路由出发,将 app 所属的 url 请求,全部转发到相应的 urls.py 模块中。而这个从主路由转发到各个应用路由的过程叫做路由的分发,而它的实现是使用include() 函数来完成的,如下所示:



  1. from django.urls import path,include
  2. from BookStore import views
  3. 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 应用添加命名空间。如下所示:



  1. urlpatterns = [
  2. path('index/',include('index.urls',namespace='first'))
  3. ]


在 index 应用的 urls.py 中添加(若之前已经添加则无需再重新添加)如下所示:

app_name="index"

最后改写 index 应用的​​test_to_reverse()​​视图函数,如下所示:



  1. def test_to_reverse(request):
  2. return HttpResponseRedirect(reverse
  3. ('index:detail_hello',current_app=request.resolver_match.namespace))


经过上面的设置我们就完成了 index 应用的命名空间操作,这样即使是不同的应用存在相同 url 名称,Django 也能精准的解析我们想要的 url 路径。