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

命名空间与路由命名

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,但实际开发中没有实质的作用。
注: 在不同项目应用的路由命名可以重复的,这种命名是合理的。但在一个项目中,多条路由是允许使用相同的命名的,这种方式是不合理的。
在实际开发中,支持使用路由命名,因为网站更新或防止爬虫程序往往需要频繁修改路由地址,倘若在视图或其他功能模块里使用路由地址,当路由地址发生更新变换时,这些模块里所使用的路由地址也要随之修改,这样就不利于版本的变更和维护;相对而言,如果在这些功能模块里使用路由命名来生成路由地址,就能避免路由地址的更新维护问题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章