Django命名空间app_name和namespace

前言: 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!!!!")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值