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"))