Django命名空间app_name和namespace

摘要:
应用命名空间用法。在应用程序url_name中定义应用程序一个应用程序可以创建多个URL以映射到一个应用,因此会出现问题。如果在反转过程中不使用名称空间,则会感到困惑。为了避免这个问题。向include函数添加命名空间;这里有两个例子来说明第一个:场景1。在不同的应用程序#pythonmanagement中创建一个具有命名空间的新应用程序。systemartapppp01#蟒蛇管理。systemartapppp02.从django.attribumportadminfromdjang.conf.ulsimporturl,includefromdjango配置主URL。urlsimportpathurlspatterns=[path,path,path,]app01配置项目_ Django/app01/urls。pyfromdjango。URL端口路径。importviewsurlpatterns=[path,path,]app01配置project_django/app01/views.pfromdjango.httpimportHttpResponsefromdjang.shortcutsimortrenderfromdjango。shortcutsimortredirect,Reverse#创建您的viewshere。定义:ifrequest。获取。get:returnHttpResponse(“frontpageapp01!django此时返回到谁?此时,我们使用名称空间app_name来解决此问题。修改app01的配置以配置project_django/app01/urls.pyfromdjango.urlsportpath from.importviews#namespace app_name='app01'#urlspatterns=[path,path,]App01配置项目_django/App01/views.pyfromdjango.httpimportHttpResponsefromdjango。shortcutsimortrenderfromdjang.shortcutsimportredirect,reverse#Createyourviewshere.defindex:irfequest.GET.GET:returnHttpResponse(“frontpageapp01!
前言: django命名空间解决什么问题?
  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!!!!")

原文链接:https://blog.51cto.com/jiajinh/2432449

免责声明:文章转载自《Django命名空间app_name和namespace》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇当滚动条滚动到页面某个位置时,触发js,OPENXML解析sp_xml_preparedocument获取的XML句柄下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

django 类视图

类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图。使用类视图可以使用类的一些特性,比如继承等。 View: django.views.generic.base.View是主要的类视图,所有的类视图都是继承自他。如果我们写自己的类视图,也可以继承自他。然后再根据当前请求的method,来实现不同的方法。比如这个视图只能使用get...

【转帖】ipad Cydia 大全

加源,以下为方法:1.进入Cydia,2.等待,直到标题栏出现home·cydia字样。3.点击屏幕下方一条的第四个,Manage4.选择第二个,Sources.5.选择cydia内位于上部的一条,右边有一个edit,6.在点击同一行左边的Add,7.输入源地址(就是下面的地址):8.点击Add Source,9.等待……10.添加完后会出现按钮,点击按钮...

IOS AudioServicesPlaySystemSound 后台锁屏播放

AudioServicesPlaySystemSound  想在锁屏后台播放报警提示音。 添加了UIBackgroundModes,audio,官方审核不通过! IOS的闹钟是怎么实现的,锁屏不能播放声音?原来是用了notification方法。 http://zhangmingwei.iteye.com/blog/1831378 notification...

常用 adb 命令总结

1. 显示当前运行的全部模拟器: adb devices2. 安装应用程序: adb install -r 应用程序.apk3. 获取模拟器中的文件: adb pull <remote> <local>4. 向模拟器中写文件: adb push <local> <remote>5. 进入模拟器的shell模式...

egg.js jwt 几步实现加解密

1.安装 npm install --save egg-cors egg-jwt 2.配置 // config/config.default.jsconfig.jwt ={ secret: '123456', enable: true, //default is false match: '/jwt', //optional...

revit添加族参数

打开一个族文件,并为族文件添加参数 public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){try{UIApplication uiApp = commandData.Application;Autodesk.Revit....