Django2.0-urls(4)-模块化和命名空间

本文介绍Django框架中URL的模块化管理方法,包括如何让每个应用管理自己的URL,以及通过应用命名空间和实例命名空间避免URL冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

url模块化

  • 如果所有的URL都放在主urls.py,则不好管理

  • 可以让每个app管理自己对应的URL

  • 在app包下新建一个文件(比如urls.py)来存储这些URL的映射

  • 操作

    1. 在主urls.py中导入include函数,用include函数包含子urls.py,参数是应用名.子urls文件名

      #主urls.py
      from django.urls import path, include #导入include模块
      
      urlpatterns = [
          path('app/sub/', include("App.urls")), #App是应用名,urls是App下的urls.py
      ]
      
      
    2. 在app的urls.py中,所有的URL匹配也是放在urlpatterns

      # App下的urls/py
      
      from django.urls import path #记得导入
      from . import views # 导入自己包下的视图函数
      
      urlpatterns = [
          path('list', views.url_sub),
          path('<param>', views.url_sub_param)
      ]
      
    3. URL的具体地址是根据主urls.py和app中的子urls.py进行拼接,因此不要多加斜杠

      • 比如上面就是app/sub/+list或者+<param>

命名空间

应用命名空间

  • 在多个app之间,出现同名的URL,为了避免在reverse()的时候出现歧义,可以使用应用命名空间。
  • 在app的urls.py中定义一个app_name的变量,来指定这个应用的命名空间即可。
  • reverse(app_name:url_name)来进行翻转。

实例命名空间

  • 一个app可以产生多个实例,可以使用多个URL映射到同一个app,在做翻转的时候仅仅指定应用命名空间,可能会跳到其他实例的函数中。

  • 接下来引用的知了课堂-Django的例子

    # 主urls.py
    urlpatterns = [    
        path('cms1/', include("CMS.urls")),
        path('cms2/', include("CMS.urls")),
    ]
    
    #CMS app 中的子urls.py
    from django.urls import path
    from . import views
    
    app_name = "CMS" #应用命名空间
    
    urlpatterns = [
    
        path('page1', views.Webpage1, name="p1"), #URL名
        path('page2', views.Webpage2, name="p2"), #URL名
    
    ]
    
    from django.shortcuts import render,HttpResponse,redirect
    
    from django.urls import reverse
    
    
    def Webpage1(request):
        value = request.GET.get("name")  
        if value:
            return HttpResponse("page1")
        else:
            current_space = request.resolver_match.namespace
            print(current_space) #如果没有设置实例命名空间,则namespace为空
            return redirect(reverse("CMS:p2"))  # CMS:p2 调用的都是作为应用命名空间的CMS
    
    
    def Webpage2(request):
        return HttpResponse("page2")
    
    • 运行

      • 浏览器键入127.0.0.1:8000/cms1/page1

      run1

      • 浏览器键入127.0.0.1:8000/cms2/page1

      run2

      • 会发现调用的都是实例cms1webpage2函数
  • 可以使用实例命名空间,在include()函数中传递一个namespace变量即可,但是要注意,指定实例命名空间,必须向指定应用命名空间
    下面只注释有改变的地方

    # 主urls.py
    urlpatterns = [
        path('cms1/', include("CMS.urls", namespace="one")), #添加cms1的实例名为one
        path('cms2/', include("CMS.urls", namespace="two")), #添加cms2的实例名为two
    ]
    
    
    #CMS app 中的子urls.py
    from django.urls import path
    from . import views
    
    app_name = "CMS" 
    
    urlpatterns = [
    
        path('page1', views.Webpage1, name="p1"), 
        path('page2', views.Webpage2, name="p2"), 
    
    ]
    
    from django.shortcuts import render,HttpResponse,redirect
    
    
    from django.urls import reverse
    
    
    def Webpage1(request):
        value = request.GET.get("name")
        if value:
            return HttpResponse("page1")
        else:
            current_space = request.resolver_match.namespace #获得命名空间
            print(current_space) 
            return redirect(reverse("{}:p2".format(current_space)))#记住reverse的是URL的名字, 运行的时候都是就根据各自的namespace变成 one:p2或者two:p2 
            # return redirect(reverse("CMS:page2"))  
    
    
    def Webpage2(request):
        return HttpResponse("page2")
    
    • 默认的程序命名空间为空
    #views.py
    def views_func(request):
        ...
        current_space = request.resolver_match.namespace
        print(current_space)
        ...
    
    • 运行

      • 浏览器键入127.0.0.1:8000/cms1/page1

      run11

      • 浏览器键入127.0.0.1:8000/cms2/page1

        run22

      • 此时跳转的都是各自实例的webpage2函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值