Django从理论到实战(part12)--应用命名空间和实例命名空间

学习笔记,仅供参考

参考自: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命名与反转中提起过

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章