zoukankan      html  css  js  c++  java
  • django 路由控制之名称空间

    名称空间

    命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

    由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回
    我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。
     
    多个app中可能会有多个name
     
    创建一个app02 应用
    python manage.py startapp app02

    创建完app 都要再setting.py 注册app ,INSTALLED_APPS

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',
        'app02.apps.App02Config',
    ]

    全局urls.py

    from django.contrib import admin
    from django.urls import path, re_path, include
    
    from app01 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        
    
        # 分发
        re_path(r"^app01/", include("app01.urls")),
        re_path(r"^app02/", include("app02.urls")),
    
    
    ]

    路由分发搞多个 app02, 把app01的urls.py 文件 复制到app02应用

    app01.urls:

    from django.contrib import admin
    from django.urls import path, re_path
    
    from app01 import views
    
    urlpatterns = [
    
        re_path(r"^index/", views.index, name="index")
    ]

    app02.urls:

    from django.contrib import admin
    from django.urls import path, re_path
    
    from app02 import views
    
    urlpatterns = [
    
        re_path(r"^index/", views.index, name="index")
    
    
    ]

    两个app应用 name都相同

    app01 views.py 在app01视图反向解析

    from django.urls import reverse
    
    
    def index(request):
    
        return HttpResponse(reverse("index"))

    访问app01的index url时候 ,返回反向解析结果 是app02 url

    app02 views.py 

    from django.shortcuts import render, HttpResponse
    
    # Create your views here.
    
    from django.urls import reverse
    
    
    def index(request):
    
        return HttpResponse(reverse("index"))

    访问app02 返回也是app02 url  是覆盖问题

     

    解决方法: 

    在include 分发时候改成元祖形式 加上别名 namespace

    url 加上别名 如下下面代码

    from django.contrib import admin
    from django.urls import path, re_path, include
    
    from app01 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
    
        # 分发
        re_path(r"^app01/", include(("app01.urls", "app01"))),
        re_path(r"^app02/", include(("app02.urls", "app02"))),
    
    
    ]

    app01 views.py 视图函数

    from django.urls import reverse
    
    
    def index(request):
    
        return HttpResponse(reverse("app01:index"))

    app02 views.py 视图函数

    from django.shortcuts import render, HttpResponse
    
    # Create your views here.
    
    from django.urls import reverse
    
    
    def index(request):
    
        return HttpResponse(reverse("app02:index"))

     

  • 相关阅读:
    java 开发webservice
    myeclipse下jsp页面汉字不能保存问题
    java web项目的部署
    Java小白手记:WEB项目等
    操作系统学习笔记:虚拟内存
    面向接口编程
    WEB端应该使用DataTable/DataSet吗?
    ExtJs grid合并单元格
    操作系统学习笔记:内存管理
    Oracle中长度为0字符串与null等价
  • 原文地址:https://www.cnblogs.com/mingerlcm/p/14204863.html
Copyright © 2011-2022 走看看