django 路由控制之名称空间

名称空间

命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回
我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。
 
多个app中可能会有多个name
 
创建一个app02 应用
python manage.py startapp app02

创建完app 都要再setting.py 注册app ,INSTALLED_APPS

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
    'app02.apps.App02Config',
]

全局urls.py

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

from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    

    # 分发
    re_path(r"^app01/", include("app01.urls")),
    re_path(r"^app02/", include("app02.urls")),


]

路由分发搞多个 app02, 把app01的urls.py 文件 复制到app02应用

app01.urls:

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

from app01 import views

urlpatterns = [

    re_path(r"^index/", views.index, name="index")
]

app02.urls:

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

from app02 import views

urlpatterns = [

    re_path(r"^index/", views.index, name="index")


]

两个app应用 name都相同

app01 views.py 在app01视图反向解析

from django.urls import reverse


def index(request):

    return HttpResponse(reverse("index"))

访问app01的index url时候 ,返回反向解析结果 是app02 url

app02 views.py 

from django.shortcuts import render, HttpResponse

# Create your views here.

from django.urls import reverse


def index(request):

    return HttpResponse(reverse("index"))

访问app02 返回也是app02 url  是覆盖问题

 

解决方法: 

在include 分发时候改成元祖形式 加上别名 namespace

url 加上别名 如下下面代码

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

from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),

    # 分发
    re_path(r"^app01/", include(("app01.urls", "app01"))),
    re_path(r"^app02/", include(("app02.urls", "app02"))),


]

app01 views.py 视图函数

from django.urls import reverse


def index(request):

    return HttpResponse(reverse("app01:index"))

app02 views.py 视图函数

from django.shortcuts import render, HttpResponse

# Create your views here.

from django.urls import reverse


def index(request):

    return HttpResponse(reverse("app02:index"))

 

原文地址:https://www.cnblogs.com/mingerlcm/p/14204863.html