学习笔记,仅供参考
参考自:Django打造大型企业官网;
本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列中,尽量详细的写一下。
应用命名空间和实例命名空间
- 在同一个app下创建2个实例
啥叫在同一个app下创建2个实例呢?我们用下面的代码解释以下:
urlpatterns = [
path('admin/', admin.site.urls),
path('cms1/', include('cms.urls')),
path('cms2/', include('cms.urls')),
]
这段代码表示,有两个路由都可以指向同一个app,这就是在同一个app下创建2个实例,第一个实例为cms1,第二个实例为cms2。
- 为何要有实例命名空间
如果我们在同一个app下创建2个实例,那么在进行url反转时使用应用命名空间,可能会出现访问混乱的问题,我们拿下面这个例子举例。
主urls.py:
from django.contrib import admin
from django.urls import path
from . import views
from django.conf.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.baidu),
path('login/', views.login, name = "signin"),
path('book/', include('book.urls')),
path('cms1/', include('cms.urls')),
path('cms2/', include('cms.urls')),
path('front/', include('front.urls')),
]
cms应用下的urls.py:
from django.urls import path
from . import views
app_name = 'cms'
urlpatterns = [
path('', views.index),
path('login/', views.login, name = "signin"),
]
cms应用下的views.py:
from django.http import HttpResponse
from django.shortcuts import redirect,reverse
# Create your views here.
def index(request):
username = request.GET.get("username", "")
if username:
return HttpResponse("CMS首页")
else:
login_url = reverse('cms:signin')
#利用url的name参数反转得到相应的url
print("-+"*15)
print(login_url)
print("-+"*15)
return redirect(login_url)
def login(request):
return HttpResponse("CMS登录页面")
向http://127.0.0.1:8000/cms1/发起请求:
向http://127.0.0.1:8000/cms2/发起请求:
我们看到,我们对http://127.0.0.1:8000/cms2/发起请求,应该得到的是http://127.0.0.1:8000/cms2/login/,但是却得到的是http://127.0.0.1:8000/cms1/login/
这时,访问产生了混乱。为了解决这种混乱,我们需要在主urls.py中定义实例命名空间,来解决这个问题。
- 定义实例命名空间
该如何定义实例命名空间呢?
我们可以在主urls.py模块中,在include方法中对namespace参数进行设置:
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.baidu),
path('login/', views.login, name = "signin"),
path('book/', include('book.urls')),
path('cms1/', include('cms.urls', namespace = "cms1")),
path('cms2/', include('cms.urls', namespace = "cms2")),
path('front/', include('front.urls')),
]
在cms应用的views.py模块中,可以利用request.resolver_match.namespace
获取实例命名空间namespace:
from django.http import HttpResponse
from django.shortcuts import redirect,reverse
# Create your views here.
def index(request):
username = request.GET.get("username", "")
if username:
return HttpResponse("CMS首页")
else:
current_namespcae = request.resolver_match.namespace
login_url = reverse('{}:signin'.format(current_namespcae))
#利用url的name参数反转得到相应的url
print("-+"*15)
print(login_url)
print("-+"*15)
return redirect(login_url)
def login(request):
return HttpResponse("CMS登录页面")
现在,我们向http://127.0.0.1:8000/cms1/发起请求:
向http://127.0.0.1:8000/cms2/发起请求:
可以看到,设置过实例命名空间后,我们的页面跳转就正常了。
- 注意事项
如果我们只定义了实例命名空间(namespace),而没有定义应用命名空间(app_name),就会报错。
后记:应用命名空间我在BlogURL命名与反转中提起过