zoukankan      html  css  js  c++  java
  • 应用命名空间和实例命名空间

    前言: 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!!!!")
  • 相关阅读:
    每日一个设计模式之策略模式
    Java发送get和post请求
    sql分组取最大值
    解析xml
    jsp:include
    schema的详解2
    文法和语言
    高级语言程序简介
    Dataframe根据某一列的值获取满足条件的行的其他列的值
    Dataframe数值转为二维列表
  • 原文地址:https://www.cnblogs.com/shangping/p/11637999.html
Copyright © 2011-2022 走看看