在写django的时候,html中反向解析经常会用到app_name 但有时候又是namespace,具体的区别如下:

  大部分情况 这两者有其一就可以了。 并且两者(可以简化理解)无区别

  只要一种情况   比如  访问

    path('book1/', include('book.urls')),
path('book2/', include('book.urls')),

这种情况下(访问不通的url  但是执行的是一个app ,并且走一个方法或者类),必须用appname来区分,这时候用app_name就无法区分了!!

  以下测试实例来自  https://blog.51cto.com/jiajinh/2432449

  1. 在多个app之间,有可能产生同名的url,这个时候避免反转url的时候混淆,可以使用应用命名空间做区分。应用命名空间使用。在应用url中定义 app_name;

  2. 一个app,可以创建多个url映射到一个app中,所以就会产生一个问题,在做反转的时候,如果不使用命名空间,就会混淆,为了避免这个问题。我们可以使用实例命名空间。在include函数中添加namespace即可;

下面通过两个案例说明

一: 场景1,不同应用中的命名空间

(1)新建app应用

#python manage.py startapp app01
#python manage.py startapp app02

(2)主URL配置

from django.contrib import admin
from django.conf.urls import url, include
from django.urls import path urlpatterns = [
path('admin/', admin.site.urls),
path('app01/', include('app01.urls')),
path('app02/', include('app02.urls')),
]
 

(2)app01配置 project_django/app01/urls.py

from django.urls import path
from . import views urlpatterns = [
path('', views.index,name='index'),
path('login', views.login,name='login'),
]
 

(3)app01配置 project_django/app01/views.py

from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect,reverse # Create your views here. def index(request):
if request.GET.get("username"):
return HttpResponse("front page app01!")
else:
return redirect(reverse("login")) def login(request):
return HttpResponse("Login page app01!")

(4)app02配置 project_django/app02/urls.py

from django.urls import path
from . import views urlpatterns = [
path('', views.index,name='index'),
path('login', views.login,name='login'),
]
 

(5)app02配置 project_django/app02/views.py

from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect, reverse # Create your views here. def index(request):
if request.GET.get("username"):
return HttpResponse("front page app02!")
else:
return redirect(reverse("login")) def login(request):
return HttpResponse("Login page app02!")

我们可以看到每个app下面的urls都定义了name=index和name=login。 而每个views下面的reverse都是login。这个时候django回去找谁呢? 当我们浏览器打开路径: http://127.0.0.1:8000/app01 的时候,我们会发现跳转异常,竟然跳转到地址: http://127.0.0.1:8000/app02/login 上面。

这个时候我们使用命名空间app_name,就可以很好解决这个问题。

修改配置

(1)app01配置 project_django/app01/urls.py

from django.urls import path
from . import views #命名空间
app_name = 'app01' #这里变化了 urlpatterns = [
path('', views.index,name='index'),
path('login', views.login,name='login'),
]
 

(2)app01配置 project_django/app01/views.py

from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect,reverse # Create your views here. def index(request):
if request.GET.get("username"):
return HttpResponse("front page app01!")
else:
return redirect(reverse("app01:login")) #这里变化了 def login(request):
return HttpResponse("Login page app01!")

(3)app02配置 project_django/app02/urls.py

from django.urls import path
from . import views app_name = 'app02' #这里变化了 urlpatterns = [
path('', views.index,name='index'),
path('login', views.login,name='login'),
]
 

(4)app02配置 project_django/app02/views.py

from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect, reverse # Create your views here. def index(request):
if request.GET.get("username"):
return HttpResponse("front page app02!")
else:
return redirect(reverse("app02:login")) #这里变化了 def login(request):
return HttpResponse("Login page app02!")

当我们浏览器打开路径: http://127.0.0.1:8000/app01 的时候,就会正常跳转地址: http://127.0.0.1:8000/app01/login 了

二: 场景2,同一个应用中的命名空间

先新启一个实例, #python manage.py startapp book

1. 我们先看一下代码案例,假设

(1)主URL,project_django/project_django/urls.py

from django.contrib import admin
from django.conf.urls import url, include
from django.urls import path urlpatterns = [
path('admin/', admin.site.urls),
path('book1/', include('book.urls')),
path('book2/', include('book.urls')),
]
多个url,指向同一个app。
 

(2)应用book的子URL,project_django/book/urls.py

from django.urls import path
from . import views urlpatterns = [
path('', views.book_list),
path('login', views.book_login, name="login"),
]

(3)视图,project_django/book/views.py

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
from django.shortcuts import redirect,reverse def book_list(request):
if request.GET.get("username"):
return HttpResponse("My book list !!!!")
else:
return redirect(reverse("login")) def book_login(request):
return HttpResponse("Please Login!!!!")
 

通过上面案例,我们可以知道。
当执行http://127.0.0.1:8000/book2/ 的时候就会跳转http://127.0.0.1:8000/book2/login
当执行http://127.0.0.1:8000/book1/ 的时候发现还是跳转http://127.0.0.1:8000/book2/login

这不是我们想要的结果,我们希望访问/book1/的时候跳转/book1/login;访问/book2/的时候跳转/book2/login; 那么通一个应用中的两个实例,我们如何区分?

2. 案例修改

(1)主URL

from django.contrib import admin
from django.conf.urls import url, include
from django.urls import path urlpatterns = [
path('admin/', admin.site.urls),
path('book1/', include('book.urls'), namespace='book1')), #变更部分
path('book2/', include('book.urls'), namespace='book2')), #变更部分
]

(2)应用book的子URL

from django.urls import path
from . import views app_name = "book" urlpatterns = [
path('', views.book_list),
path('login', views.book_login, name="login"),
]

(3)视图

def book_list(request):
#获取当前namespace名称。
current_namespace = request.resolver_match.namespace #变更部分
if request.GET.get("username"):
return HttpResponse("My book list !!!!")
else:
print(current_namespace)
#动态返回命名空间信息
return redirect(reverse("%s:login"% current_namespace)) #变更部分 def book_login(request):
return HttpResponse("Please Login!!!!")
 

三: include介绍

(1)include(module,namespace=Node)

  • module:应用app的名称.urls
  • namespace:实例命名空间。如果指定实例命名空间,那么必须指定应用命名空间。
    也就是在应用app的urls.py添加app_name=’xxx‘
    如果不加app_name,报错信息:'Specifying a namespace in include() without providing an app_name '

(2)include((pattern_list,app_namesapace),namespace=None)

    • 如果不想在子app中的urls加app_name,那么就可以利用这种方法实现;
    • 例子:include(('book.urls','book'),namespace='book')

  

django中app_name以及namespace理解的更多相关文章

  1. Django 中 app_name (应用命名空间) 和 namespace (实例命名空间) 的区别

    转自:https://www.jianshu.com/p/404500a0408a 补充理解: 先把官网上对应用命名空间(app_name)和实例命名空间(namespace)的解释贴上: app_n ...

  2. django 中namespace的问题

    在早期的django版本中 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^polls/', include('polls.urls' ...

  3. [Django高级]理解django中的中间件机制和执行顺序

    原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middlewa ...

  4. 对Django框架中Cookie的简单理解

    概念的理解:首先Cookie和Session一样,是django中用于视图保持状态的方案之一.为什么要进行视图保留呢,这是因为浏览器在向服务器发出请求时,服务器不会像人一样,有记忆,服务器像鱼一样,在 ...

  5. Django 中url补充以及模板继承

    Django中的URL补充 默认值 在url写路由关系的时候可以传递默认参数,如下: url(r'^index/', views.index,{"name":"root& ...

  6. Django中url的生成过程详解

    在前面我们知道,Django启动之前会执行admin.py中的autodiscover()方法. def autodiscover(): autodiscover_modules('admin', r ...

  7. django中引入bootstrap4.3

    1.下载bootstrap4.3的包:https://getbootstrap.com/ 2.将下载后的文件放在project下新创建的static目录下.例如我的project是mysite,则放在 ...

  8. Django中url的反向查询

    明确几个概念: application namespace:   正在部署的app的名称,一个app的多个实例应该具有相同的application namespace.   可以通过在URLconf模 ...

  9. Django中URL的解析和反查

    add by zhj: 如果想用reverse(namespace1:namespace2:...:namespaceN:name)反查url(注意:用reverse('polls:index')方法 ...

随机推荐

  1. (翻译) Poor misunderstood 'var'

    It seems most programmers coming to JavaScript from C, C++, Java, and the like equate the var statem ...

  2. JMeter 不同线程组间变量传递(亲测 ok)

    JMeter元件都是有作用域的,而变量大多使用正则表达式提取器,要想在不通过线程组件使用变量参数,则需要设置全部变量 JMeter函数助手就提供了一个函数用于设置全局变量属性,实现的功能类似于在用户自 ...

  3. windows下redis配置密码

    redis安装后目录如下: 最简单的启动方式是直接双击redis-server.exe 如果要设置密码,首先打开配置文件,要注意的是这两个都是配置文件,记住你改的是哪一个,不放心的可以两个都改. 然后 ...

  4. linux ssh利用公钥免密登陆

    1.安装检查ssh 如果没有ssh的话,需要安装 #yum  install -y openssh-server openssh-clients 2.生成秘钥 ssh-keygen -t rsa 执行 ...

  5. sed工具的基本用法

    sed文本处理工具的用法: 用法1:前置命令 | sed [选项] '条件指令' 用法2:sed [选项] '条件指令' 文件.. .. 认识sed工具的基本选项 sed命令的常用选项如下: -n(屏 ...

  6. springmvc 参数解析绑定原理

    handlerMethodArgumentResolver:方法参数解析器接口,这个接口是springmvc参数解析绑定的核心接口.不同的参数类型绑定都是通过实行这个接口来实现.也可以通过实现这个接口 ...

  7. AndroidMainfest详解

    基于TV settings和SettingsProvider Android启动模式对activity行为的影响 AndroidManifest.xml文件详解 Manifest文件中,applica ...

  8. sql server新旧数据库的表结构差异

    sql server编写通用脚本自动检查两个不同服务器的新旧数据库的表结构差异 问题:工作过程中,不管是什么项目,伴随着项目不断升级版本,对应的项目数据库业务版本也不断升级,数据库出现新增表.修改表. ...

  9. hdu 2871 Memory Control (区间合并 连续段的起始位置 点所属段的左右端点)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871 题意: 四种操作: 1.Reset  清空所有内存2.New x  分配一个大小为x的内存块返回,返 ...

  10. [github] 关于华为鸿蒙OS

    English Docs | 中文文档 | Türkçe Dökümanlar HarmonyOS Ⅰ. 鸿蒙系统简介 鸿蒙系统(HarmonyOS),是第一款基于微内核的全场景分布式OS,是华为自主 ...