应用命名空间和实例命名空间

前言: django命名空间解决什么问题?

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

下面通过两个案例说明

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

(1)新建app应用


1

2

#python manage.py startapp app01

#python manage.py startapp app02

(2)主URL配置


1

2

3

4

5

6

7

8

9

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


1

2

3

4

5

6

7

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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


1

2

3

4

5

6

7

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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


1

2

3

4

5

6

7

8

9

10

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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


1

2

3

4

5

6

7

8

9

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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


1

2

3

4

5

6

7

8

9

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


1

2

3

4

5

6

7

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


1

2

3

4

5

6

7

8

9

10

11

12

13

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


1

2

3

4

5

6

7

8

9

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


1

2

3

4

5

6

7

8

9

from django.urls import path

from import views

app_name = "book"

urlpatterns = [

    path(‘‘, views.book_list),

    path(‘login‘, views.book_login, name="login"),

]

(3)视图


1

2

3

4

5

6

7

8

9

10

11

12

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

原文地址:https://www.cnblogs.com/shangping/p/11637999.html

时间: 2024-10-09 11:27:53

应用命名空间和实例命名空间的相关文章

017:应用命名空间和实例命名空间

应用命名空间和实例命名空间: 什么是实例命名空间:就是多个url映射到同一个app上,如下代码便是: path('cms1/', include('cms.urls')), path('cms2/', include('cms.urls')), 如下图: 基于上节(应用命名空间——016)的情况会出现什么情况呢? 1.想看一下cms里的情况,如下图: 访问:http://127.0.0.1:8000/cms1/跳转到:http://127.0.0.1:8000/cms1/login/  :但是访

javascript 命名空间的实例应用

/** * 创建全局对象MYAPP * @module MYAPP * @title MYAPP Global */ var MYAPP = MYAPP || {}; /** * 返回指定的命名空间,如果命名空间不存在则创建命名空间. * 备注:命名时需小心,注意保留关键字,可能在一些浏览器无法使用. * * @method namespace * @param {String *} 至少需要创建一个命名空间 * @return {Object} 最后一个命名空间创建的对象的引用 */ MYAP

django-URL实例命名空间(十一)

每生成一个地址,都是一个实例.使用实例命名空间,针对于一个app而言. book/views.py from django.http import HttpResponse from django.shortcuts import render,redirect,reverse from django.urls import resolve # Create your views here. def index(request): username = request.GET.get("user

命名空间System.Threading命名空间的同步锁 Monitor类

官方备注: Monitor类通过向单个线程授予对象所来控制对对象的访问.对象所提供限制访问代码块的能力.当一个线程拥有对象的锁时,其他任何线程都不能获取该锁.还可以使用Monitor来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码,除非另一个线程正在使用其他的锁定对象执行改代码. Monitor类调用Enter或TryEnter方法获取对象锁,使用Exit放弃对象锁,在Enter/TryEnter和Exit之间可调用Pause/PauseAll或Wait方法,Wait方法的调用会

实例分析JVM安全体系:双亲委派、命名空间、保护域、策略

在了解双亲委派模型之前,先了解一下类加载器的概念: 类加载器的作用就是将真实的class文件根据位置将该Java类的字节码装入内存,并生成对应的Class对象.用户可以通过继承ClassLoader和重写findClass方法来定义自己的类加载器进行加载,系统类加载器按照层次,分为: (1).启动类加载器(Bootstrap ClassLoader):将加载 /JAVAHOME/lib以及为-Xbootclasspath所指定的目录下的类库,是核心Java API的class文件,用于启动Jav

django-url调度器-高级篇

我们在中级篇中学会了如何进行反向解析,但是有这样一个问题,在为 url 命名的时候,名字不能重复,否则会导致各种各样的问题.在 url 还少的时候保证不重名还是比较简单的,但是 url 多起来以后就比较难了.为了解决这样的问题,可以在 url 中加一个前缀.例如,我有一个 url 的名字叫做 'comment' ,此时,我可以为其加一个前缀,这个前缀通常是 app 名,例如:'myapp-comment'. 这也是django所推荐的命名方式,但是这样始终是治标不治本.此时,我们就要学习 dja

python之路 面向对象(一)

面向过程vs面向对象 面向过程的核心是过程,是解决问题的步骤. 优点:极大降低了写程序的复杂度,只需顺着要执行的步骤,码代码即可. 缺点:一套程序解决一个问题,牵一发动全身. 面向对象的核心是对象. 优点:解决了程序的扩展性,对某一个单一对象的修改,会映射到整个体系中. 缺点:可控性差,无法向面向过程一样可以很精准的预测到结果,面向对象程序一旦开始就由对象之间的交互解决问题,无法预测结果. 类和对象(实例) python中一切皆对象,类型的本质就是类,包括字典,列表,数字,字符串等. 在pyth

谈谈Python之Django搭建企业级官网(第三篇下部)

转载请注明来源地址和原作者(CFishHome) 前沿 上一篇文章我们学习了URL与视图函数的映射.传递参数的三种方式.转换器的简单使用和include函数分层映射管理.接下来这一篇文章着重介绍Path.re_path.include.reverse.redirect函数的使用和自定义URL转换器.学完这些内容,相信我们对URL和视图都会有了一定的了解和认识.为了让每篇文章具有一定的独立性,我决定每篇文章都重新新建一个项目,便于测试和调试. 预备 首先,我们在Pycharm重新新建一个名为boo

Django2.1视频教程

课程名称:超细讲解Django打造大型企业官网课程类型:Python3.7, Django2.1课程数量:334集课程代码:有总共大小:44.5 GB共享连接:链接:https://pan.baidu.com/s/1WMqpupMC75NGi6pFV3x0xA 提取码:1rv6课程目录:001.[虚拟环境]为什么需要虚拟环境.mp4 002.[虚拟环境]virtualenv创建虚拟环境.mp4 003.[虚拟环境]virtualenvwrapper使用.mp4 004.[Django预热]URL