django的include函数相关的命名空间详解
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:
ib 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:
ib import admin
from django.urls import path
from.import views
urlpatterns =[
path('',dsinfo,name ='goodsinfo'),
path('car/',views.car,name='car'),
]
app02下的urls.py:
ib import admin
from django.urls import path
from.import views
urlpatterns =[
path('',dsinfo,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的购物车页')
这就是我们上⾯说的了,url反向路由解析的时候出现了问题,在app01和app02下⾯的views.py的goodinfo函数中,我们下反向解析到的路由是相同的,我们要知道计算机是很傻的,如果你不给它规则,它是不会知道你要哪⼀个的。
那么,要解决这个问题,我们就要⽤到了应⽤命名空间来区分。
定义应⽤命名空间只要在app的urls.py中定义⼀个app_name变量来指定这个应⽤的命名空间就可以。
我们先来看⼀种写法:
项⽬下的urls.py还是和上⾯⼀样。
app01下的urls.py:
ib import admin
from django.urls import path
from.import views
#应⽤命名空间
app_name ='app01'
urlpatterns =[
path('admin/', admin.site.urls),
path('',dsinfo,name ='goodsinfo'),
path('car/',views.car,name='car'),
]
app02下的urls.py:
ib import admin
from django.urls import path
from.import views
#应⽤命名空间
app_name ='app02'
urlpatterns =[
path('', dsinfo, 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:
ib 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:
ib import admin
from django.urls import path
from.import views
#应⽤命名空间
# app_name = 'app01'
urlpatterns =[
path('admin/', admin.site.urls),
path('',dsinfo,name ='goodsinfo'),
path('car/',views.car,name='car'),
]
app02下的urls.py:
ib import admin
from django.urls import pathdjango项目实例
from.import views
#应⽤命名空间
# app_name = 'app02'
urlpatterns =[
path('', dsinfo, 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上产⽣的情况。希望对您能有帮助,共勉。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论