django中app_name以及namespace理解
在写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
在多个app之间,有可能产生同名的url,这个时候避免反转url的时候混淆,可以使用应用命名空间做区分。应用命名空间使用。在应用url中定义 app_name;
- 一个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理解的更多相关文章
- Django 中 app_name (应用命名空间) 和 namespace (实例命名空间) 的区别
转自:https://www.jianshu.com/p/404500a0408a 补充理解: 先把官网上对应用命名空间(app_name)和实例命名空间(namespace)的解释贴上: app_n ...
- django 中namespace的问题
在早期的django版本中 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^polls/', include('polls.urls' ...
- [Django高级]理解django中的中间件机制和执行顺序
原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middlewa ...
- 对Django框架中Cookie的简单理解
概念的理解:首先Cookie和Session一样,是django中用于视图保持状态的方案之一.为什么要进行视图保留呢,这是因为浏览器在向服务器发出请求时,服务器不会像人一样,有记忆,服务器像鱼一样,在 ...
- Django 中url补充以及模板继承
Django中的URL补充 默认值 在url写路由关系的时候可以传递默认参数,如下: url(r'^index/', views.index,{"name":"root& ...
- Django中url的生成过程详解
在前面我们知道,Django启动之前会执行admin.py中的autodiscover()方法. def autodiscover(): autodiscover_modules('admin', r ...
- django中引入bootstrap4.3
1.下载bootstrap4.3的包:https://getbootstrap.com/ 2.将下载后的文件放在project下新创建的static目录下.例如我的project是mysite,则放在 ...
- Django中url的反向查询
明确几个概念: application namespace: 正在部署的app的名称,一个app的多个实例应该具有相同的application namespace. 可以通过在URLconf模 ...
- Django中URL的解析和反查
add by zhj: 如果想用reverse(namespace1:namespace2:...:namespaceN:name)反查url(注意:用reverse('polls:index')方法 ...
随机推荐
- 19 Flutter仿京东商城项目 商品详情 底部浮动导航布局 商品页面布局
效果: widget/JdButton.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.da ...
- 使用redisTemplate存储数据,出现\xAC\xED\x00\x05t\x00
本文开发环境:SpringBoot+RedisTemplate 代码: /** * 缓存Map * * @param key * @param dataMap * @return */ @Overri ...
- FPGA回忆记事(一):基于Nios II的LED实验
实验一:基于Nios II的LED实验 一. 创建Quartus II工程 1.打开Quartus II环境.开始->程序->Altera->Quartus II 9.1. 2 ...
- django 之(五) --- 验证码|富文本|邮箱短信
验证码 在用户登录,注册以及一些敏感操作的时候,我们为了防止服务器被暴力请求,或爬虫爬取,我们可以使用验证码进行过滤,减轻服务器的压力. 原生实现: 库名:pip install Pillow ...
- kali PIN码破解
airmon-ng start wlan0 //开启网卡airodump-ng wlan0mon //监听模式,查找开启wps的apreaver -i wlan0mon -b [ap’s m ...
- linux文本处理三剑客(一)---grep
在linux种有一句话,叫做一切皆文件.文件有个特点,它是个文本.它可以读.可以写,如果是二进制文件,它还能执行.这样的话,我们在使用linux的时候,多数时间都是要和各式各样文件打交道的.那么,熟悉 ...
- Netty源码剖析-启动服务
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! --1主线分两步: 一:首先在our thread里,如果写在mai ...
- Web应用中访问WEB-INF下的资源
WEB-INF目录是出于保护资源文件的目的,只能我们开发人员自己查看不可以通过URL直接访问的: 有时候我们也想直接访问WEB-INF中的资源,那就需要用到请求转发了(重定向redirect是不可以的 ...
- ros msg和srv使用
在包文件中新建文件夹srv和msg,在这两个文件夹中新建test.msg,test.srv 修改apckage.xml 添加以下内容 <build_depend>:message_gene ...
- Laravel框架与ThinkPHP框架的不同
作为一个PHP菜鸟初学Laravel框架 在学习过程中我发现了其与TP框架的不同点,由于时间问题和认识还不够完善我先写出其中几点,有错误的地方希望各位大牛斧正... 1.渲染模版方式的不同:在Lara ...