欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Django2.X—路由命名空间与路由命名

程序员文章站 2022-06-05 17:29:23
...

命名空间与路由命名

1、 命名空间namespace

在MyDjango项目中创建新的项目应用user,并且在user文件里创建urls.py,然后配置文件settings.py的INSTALLED_APPS中添加项目应用user,使得Django在运行的时候能够识别项目应用user。在MyDjango文件夹的urls.py中重新定义路由信息,分别指向index文件夹的urls.py和user文件夹的urls.py,代码如下:

from django.contrib import admin
from django.urls import path,include
urlpatterns = [
    # 指向内置Admin后台系统的路由文件sites.py
    path('admin/',admin.site.urls),
    # 指向index的路由文件urls.py
    path('',include(('index.urls','index'),namespace = 'index')),
    # 指向user的路由文件urls.py
    path('user/', include(('user.urls', 'user'), namespace='user')),
]

上述代码中,新增的路由使用Django路由函数include并且指向index文件夹的urls.py和user文件夹的urls.py。在函数include里设置了可选参数namespace,该参数是函数include特有的参数,这就是Django设置路由的命名空间。
路由函数include设有参数arg和namespace,参数arg指向项目应用App的urls.py文件,其数据格式以元组或字符串表示;可选参数namespace是路由的命名空间。
若要对路由设置参数namespace,则参数arg必须以元组格式表示,并且元组的长度必须为2.元组的元素说明如下:

  • 第一个元素为项目应用的urls.py文件,比如(“index.urls”,“index”)的"index.urls",这是代表项目应用index的urls.py文件。
  • 第二个元素可以自行命名,但不能为空,一般情况下是以项目应用的名称进行命名,(“index.urls”,“index”)的"index"是以项目应用index进行命名的。

如果路由设置参数namespace并且参数arg为字符串或元组长度不足2的时候,在运行MyDjango的时候,Django就会提示错误信息。
接下来分析路由函数include的作用,它是将当前路由分配到某个项目应用的urls.py文件,而项目应用的urls.py文件可以设置多条路由,这种情况类似计算机上的文件夹A,并且该文件夹下包含多个子文件夹,而Django的命名空间namespace相当于对文件夹A进行命名。Django的命名空间namespace可以为我们快速定位某个项目的urls.py,再结合路由命名name就能快速地从项目应用地urls.py找到某条路由地具体信息,这样就能有效管理整个项目的路由列表。有关路由函数include的定义过程,可以在Python安装目录下找到源码(Lib\site-packages\django\urls\conf.py)进行解读。

2、 路由命名name

上面都使用路由函数include并且分别指向index文件夹的urls.py和user文件夹的urls.py,命名空间namespace分别为index和user。在此基础上,我们在index文件夹的urls.py和user文件夹的urls.py中重新定义路由,代码如下:

# index文件夹的urls.py
from django.urls import re_path,path
from . import views
urlpatterns = [
	re_path('(?P<year>[0-9]{4}.html)',views.mydate,name='mydate'),
	path('',views.index,name = 'index')
]

# user文件夹的urls.py
from django.urls import path
from . import views
urlpatterns =[
	path('index',views.index,name = 'index'),
	path('login',views.userLogin,name = 'userLogin')
]

每个项目应用的urls.py都定义了两条路由,每条路由都由相应的视图函数进行处理,因此在index文件夹的views.py和user文件夹的views.py中定义视图函数,代码如下:

# index文件夹的views.py
from django.http import HttpResponse
from django.shortcuts import render
def mydate(request,year):
	return HttpResponse(str(year))
def index(request):
	return render(request,'index.html')

# user文件夹的views.py
from django.http import HttpResponse
def index(request):
	return HttpResponse("This is userIndex")
def userLogin(request):
	return HttpResponse('This is userLogin')

项目应用index和user的urls.py所定义的路由都设置了参数name,这是对路由进行命名,它是路由函数path和re_path的可选参数。路由命名name的作用等同于文件夹里的文件名。
如果路由里使用路由函数include,就可以对该路由设置参数name,因为路由的命名空间namespace是路由函数include的可选参数,而路由命名name是路由函数path或re_path的可选参数,两者隶属于不同的路由函数,因此可在同一路由里共存一般情况下,使用路由函数include就没必要再对路由设置参数name,尽管设置了参数name,但实际开发中没有实质的作用。
注: 在不同项目应用的路由命名可以重复的,这种命名是合理的。但在一个项目中,多条路由是允许使用相同的命名的,这种方式是不合理的。
在实际开发中,支持使用路由命名,因为网站更新或防止爬虫程序往往需要频繁修改路由地址,倘若在视图或其他功能模块里使用路由地址,当路由地址发生更新变换时,这些模块里所使用的路由地址也要随之修改,这样就不利于版本的变更和维护;相对而言,如果在这些功能模块里使用路由命名来生成路由地址,就能避免路由地址的更新维护问题。

相关标签: Django2.2