Django基础(二)Django配置信息——路由(二)路由变量、正则路由定义、命名空间和路由命名


Django3 web应用开发实战黄永祥章节总结

路由(二)

路由变量、正则路由定义、命名空间和路由命名

1、设置路由变量

路由变量类型:字符类型、整型、slug(注释、后缀或附属等,常作为路由解释性字符)和uuid(匹配一个uuid格式的对象,用‘-’且字母必须为小写)。

先创建项目MyDjango,新建应用index

然后注册应用在settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'index',  # 注册应用
]

MyDjango的urls.py

from django.contrib import admin
from django.urls import path, include  # 导入Django的路由函数模块

# urlpatterns代表整个项目的路由集合
# 两个路由:一个Admin站点管理(创建时已自动生成,一般不用改),一个首页地址index(index文件夹下的urls.py),
urlpatterns = [
    # 'admin/'代表127.0.0.1:8000/admin的路由地址,admin.site.urls指向内置Admin功能所定义的路由信息
    path('admin/', admin.site.urls),  # 指向内置Admin后台系统的路由文件sites.py
    # '' 代表路由地址为’\‘,即127.0.0.1:8000,一般是网站首页,路由函数include是将该路由信息分发给index的urls.py处理。
    path('', include('index.urls')),  # 指向index的路由文件urls.py
]

在MyDjango项目的index文件夹的urls.py里新定义路由

from django.urls import path
from . importfrom django.urls import path
from . import views

urlpatterns = [
    # 添加带有字符类型、整型和slug的路由。<数据格式类型:变量名>,没有设置数据类型就默认字符类型。
    path('//', views.myvariable)
]
 views

urlpatterns = [
    # 添加带有字符类型、整型和slug的路由。<数据格式类型:变量名>,没有设置数据类型就默认字符类型。
    path('//', views.myvariable)
]

index的views.py编写myvariable视图函数的处理过程

from django.http import HttpResponse


# Create your views here.
def myvariable(request, year, month, day):return HttpResponse(str(year) + '/' + str(month) + '/' + str(day))

启动项目python manage.py runserver,打开浏览器输入网址127.0.0.1:8000/ 字符型 / 整型 / slug,如果变量类型不符会报错

添加路由地址外的变量
在MyDjango项目的index文件夹的urls.py

from django.urls import path
from . import views

urlpatterns = [
    # 添加带有字符类型、整型和slug的路由。<数据格式类型:变量名>,没有设置数据类型就默认字符类型。
    path('//', views.myvariable),
    # 添加路由地址外的变量month,参数只能以字典的形式表示
    path('',views.index,{'month':'2025/10/10'})
]
index的views.py
from django.http import HttpResponse


# Create your views here.
def myvariable(request, year, month, day):
    return HttpResponse(str(year) + '/' + str(month) + '/' + str(day))

def index(request,month):
    return HttpResponse('这是路由地址之外的变量:'+month)

2、正则表达式路由定义

 在MyDjango项目的index文件夹的urls.py

re_path定义路由函数正则表达式

(?P[0-9]{4})以小括号为单位,?P必须大写,为变量,长度4,只取0~9

.html:将网址设为静态网址,为变量终止符

from django.urls import re_path
from . import views

urlpatterns = [
    # 添加带有字符类型、整型和slug的路由。<数据格式类型:变量名>,没有设置数据类型就默认字符类型。
    re_path('(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2}).html', views.myvariable)
]

 没有.html则可在最后一个变量之后无限输入字符串

3、命名空间和路由命名

在刚刚文件夹上新建一个应用user,这样这里就有两个应用了:index和user

 

 MyDjango下的urls

from django.contrib import admin
from django.urls import path, include  # 导入Django的路由函数模块

# urlpatterns代表整个项目的路由集合
# 3个路由:一个Admin站点管理(创建时已自动生成,一般不用改),一个index文件夹下的urls.py),一个user文件下的urls.py
urlpatterns = [
    path('admin/', admin.site.urls),  # 指向内置Admin后台系统的路由文件sites.py
    path('', include(('index.urls','index'), namespace='index')),  # 指向index的路由文件urls.py
    path('user/', include(('user.urls', 'user'), namespace='user'))  # 指向user的路由文件urls.py
]

index下的urls.py

from django.urls import re_path,path
from . import views

urlpatterns = [
    # 添加带有字符类型、整型和slug的路由。<数据格式类型:变量名>,没有设置数据类型就默认字符类型。
    re_path('(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})', views.mydate),
    path('',views.index,name='index')
]

index下的views.py

from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
def mydate(request, year):
    return HttpResponse(str(year))
def index(request):
    return render(request,'index.html')

user下的urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('index', views.index, name='index'),
    path('login', views.userLogin, name='userLogin')
]

user下的views.py

from django.http import HttpResponse


# Create your views here.
def index(request):
    return HttpResponse("this is test userindex!")
def userLogin(request):
    return HttpResponse("this is test userLogin!")

不同项目应用的路由命名是可以重复的,namespace是路由函数include的可选参数,路由命名name是路由函数path或re_path的可选参数。include中如果设置name是没有实质作用的,所以没必要设。Django的路由名name是对路由进行命名的,作用是在开发中可以在视图或模板等其他功能模块里使用路由命名name来生成路由地址。