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上产生的情况。
希望对您能有帮助,共勉。