django的include函数相关的命名空间详解

本文深入探讨Django框架中的URL命名空间概念,包括应用命名空间与实例命名空间的使用,解决URL反向解析冲突问题,确保大型项目中URL的唯一性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.应用(app)命名空间与实例命名空间

首先我们来看一下,include()函数的一种使用形式来说什么是app命名空间,什么是实例命名空间:

include((pattern_list,app_namespace),namespace=None):

app_namespace:应用命名空间
namespace:实例命名空间;

对django不熟悉的同学可能就会问,应用命名空间和实例命名空间到底有什么用呀?接下来,我们就通过实例来瞅瞅。

2.应用命名空间使用

当app很多的情况下,有可能会产生同名的url。那样就有可能在反向路由解析的时候产生问题。例如:

项目下urls.py:

apps文件下,有两个应用app01和app02:

主路由的urls.py:

from django.contrib import admin
from django.urls import path,include,re_path

urlpatterns = [
    path('app01/',include('apps.app01.urls')),
    path('app02/',include('apps.app02.urls')),
]

app01下urls.py:

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
  
    path('',views.goodsinfo,name = 'goodsinfo'),
    path('car/',views.car,name='car'),
]

app02下的urls.py:

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
   
    path('',views.goodsinfo,name = 'goodsinfo'),
    path('car/',views.car,name='car'),

]

app01下的views.py:

from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse

def goodsinfo(request):


    return redirect(reverse('car'))

def car(request):
    return HttpResponse('我是app01的购物车页')

app02下的views.py:

from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse

def goodsinfo(request):

    return redirect(reverse('car'))

def car(request):
    return HttpResponse('我是app02的购物车页')

当我们执行http://127.0.0.1:8000/app02/时:
页面跳转到了app02的购物车页,正常
当我们执行http://127.0.0.1:8000/app01/时:
页面也跳转到了app02的购物车页,这是怎么回事呢?

这就是我们上面说的了,url反向路由解析的时候出现了问题,在app01和app02下面的views.py的goodinfo函数中,我们下反向解析到的路由是相同的,我们要知道计算机是很傻的,如果你不给它规则,它是不会知道你要找哪一个的。

那么,要解决这个问题,我们就要用到了应用命名空间来区分。

定义应用命名空间只要在app的urls.py中定义一个app_name变量来指定这个应用的命名空间就可以。

我们先来看一种写法:

项目下的urls.py还是和上面一样。
app01下的urls.py:


from django.contrib import admin
from django.urls import path
from . import views

#应用命名空间
app_name = 'app01'

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',views.goodsinfo,name = 'goodsinfo'),
    path('car/',views.car,name='car'),

]

app02下的urls.py:


from django.contrib import admin
from django.urls import path
from . import views

#应用命名空间
app_name = 'app02'

urlpatterns = [

    path('', views.goodsinfo, name='goodsinfo'),
    path('car/', views.car, name='car'),
]

app01下的views.py:

from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse

def goodsinfo(request):


    return redirect(reverse('app01:car'))

def car(request):
    return HttpResponse('我是app01的购物车页')

app02下的views.py

from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse

def goodsinfo(request):

    return redirect(reverse('app02:car'))

def car(request):
    return HttpResponse('我是app02的购物车页')

然后运行,就ok了。

另一种写法:
项目下urls.py:

from django.contrib import admin
from django.urls import path,include,re_path

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('app01/',include('apps.app01.urls')),

    # path('app02/',include('apps.app02.urls')),
    re_path('app01/',include(('apps.app01.urls','app01'))),
    re_path('app02/',include(('apps.app02.urls','app02'))),
]

app01下的urls.py:

from django.contrib import admin
from django.urls import path
from . import views

#应用命名空间
# app_name = 'app01'

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',views.goodsinfo,name = 'goodsinfo'),
    path('car/',views.car,name='car'),

]

app02下的urls.py:


from django.contrib import admin
from django.urls import path
from . import views

#应用命名空间
# app_name = 'app02'

urlpatterns = [

    path('', views.goodsinfo, name='goodsinfo'),
    path('car/', views.car, name='car'),
]

app01和app02下的views.py和上面的一种写法是一样的:

最重要的下面一点是settings.py下的配置:

在settings.py的INSTALLED_APPS中加入
‘apps.app01.apps.App01Config’,
‘apps.app02.apps.App02Config’,

所有步骤走完,就实现了,其实我们就可以发现,其实这两种方法是一样 的。

3.实例命名空间的使用:

我们发现,上面url反向路由解析是多个app中的name相同产生的情况,同理,这里的问题是,多个路由映射到同一个app上产生的情况。

希望对您能有帮助,共勉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值