项目名称为 django_project_1,项目中具有一个子应用 index。
1. 项目路由配置文件
由于在项目的全局配置文件 settings.py 中,通过配置项 ROOT_URLCONF = 'django_project_1.urls'
指定项目的路由配置文件为 django_project_1/urls.py,所以整个项目的根路由在 django_project_1/urls.py 文件中。
from django.contrib import admin from django.urls import path urlpatterns = [ # 项目会默认配置一个admin路由用于进入项目自带的管理后台 path('admin/', admin.site.urls), ]
2. 配置路由
2.1 path()
使用 path() 函数进行路由规则的配置,一个 path() 函数对应一个路由规则。
语法:
path('url表达式', 视图函数, 别名)
使用 url() 函数配置路由规则,是 django1.x 中的用法,django2.x 和 django3.x 向下兼容,在 django2.x 和 django3.x 中也可以使用 url() 函数配置路由规则。
2.2 一般路由规则的配置
当用户访问 index/ 时,调用子应用 index 中相应的视图函数 index 进行请求的处理与响应。
from django.contrib import admin from django.urls import path # 导入 index 子应用的视图 from index import views urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index) ]
index/views.py:
from django.shortcuts import render from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse('index')
2.3 命名路由的配置
在配置路由规则时,可以为路由命名,即为路由取别名,在后序如果需要使用路由且路由过长时,可以使用路由的别名进行反解析将路由解析出来使用,这样子避免书写过长的路由。
from django.contrib import admin from django.urls import path # 导入 index 子应用的视图 from index import views urlpatterns = [ path('admin/', admin.site.urls), # 通过向 path() 函数中传入 name 参数为路由命名 path('index/', views.index, name='index') ]
2.4 反向解析路由
通过 reverse() 函数可以根据路由的命名反向解析出路由。
语法:
reverse('路由的命名')
index/views.py:
from django.shortcuts import render from django.http import HttpResponse # 导入反解析函数 from django.urls import reverse # Create your views here. def index(request): return HttpResponse(reverse('index'))
2.5 子路由的配置
为了能够同一管理项目中不同子应用的路由,我们可以为每个子应用配置子路由,将同一个子应用中的路由都写在一起,同时这样子也可以避免所有的路由配置都写在项目路由配置文件中造成项目路由配置文件臃肿。
在子应用对应的目录下新建子应用路由配置文件:
在项目路由配置文件中使用 include() 函数配置子路由:
include() 函数需要传入一个参数,该参数为子应用的路由配置文件。
from django.contrib import admin from django.urls import path,include # 导入 index 子应用的视图 from index import views urlpatterns = [ path('admin/', admin.site.urls), # path('index/', views.index, name='index') path('index/', include('index.urls')) ]
在子应用的路由配置文件 index/urls.py 中,配置子应用的路由:
from django.urls import path,include # 导入 index 子应用的视图 from index import views urlpatterns = [ path('index_page/', views.index, name='index_page') ]
index/view.py
from django.shortcuts import render from django.http import HttpResponse # 导入反解析函数 from django.urls import reverse # Create your views here. def index(request): return HttpResponse('index首页')
2.6 为子路由命名(命名空间)
在使用include函数定义子路由时,可以使用namespace参数定义子路由的命名空间。命名空间表示,凡是在子应用路由配置文件中定义的路由,均属于namespace指定的名下。
命名空间的作用:避免不同子应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。
from django.contrib import admin from django.urls import path,include # 导入 index 子应用的视图 from index import views urlpatterns = [ path('admin/', admin.site.urls), # path('index/', views.index, name='index') # path('index/', include('index.urls')) # 注意:定义了命名空间,include第一个参数数据类型必须设置为元组类型, # 且元组需要包含两个元素,第一个元素为'子应用名.urls',第二个元素为'子应用名' # include第二个参数为命名空间 # 子应用路由的命名空间名通常为子应用名 path('index/', include(('index.urls', 'index'), namespace='index')) ]
指定了命名空间后,通过reverse函数反解析获取路由需要使用命名空间:路由名
from django.shortcuts import render from django.http import HttpResponse # 导入反解析函数 from django.urls import reverse # Create your views here. def index(request): return HttpResponse(reverse('index:index_page'))
2.7 带参路由的配置
需要通过路由向服务器传递参数,在路由配置时,需要在路由中使用 <参数数据类型:参数名称>
的写法。
路由中参数的数据类型有4种:
1.str:任意非空字符串,不包含’/’,默认类型
2.int:匹配0和正整数
3.slug:匹配任何ASCII字符、连接符、下划线
4.uuid:匹配一个UUID格式字符串,该对象必须包括’-’,所有的字母必须小写。如22221111-abcd-3cww-3321-123456789012
配置带参路由:
index/urls.py
from django.urls import path,include # 导入 index 子应用的视图 from index import views urlpatterns = [ path('index_page/', views.index, name='index_page'), path('show/<int:id>/<str:username>/', views.show, name='show') ]
在路由对应的处理函数中,要接收通过URL传递过来的参数,需要在处理函数的形参列表中声明相应的形参,且参数名称要和路由中的参数名称保持一致。
index/views.py
def show(request, id, username): return HttpResponse(f'{id}: {username}')
2.8 使用正则匹配URL中的参数
re_path() 函数与 path() 函数的作用一样,但是 re_path() 函数在编写路由时可以使用正则表达式。
路由中正则表达式的语法:
(?P<name>pattern) name:为参数名 pattern:为正则匹配模式
常见正则:
1..
:匹配任意单个字符
2.\d:匹配任意一个数字
3.\w:匹配字母、数字、下划线
4.*:匹配0个或多个字符,\d*
表示匹配0个或多个数字
5.[a-z]:匹配a-z中任意一个字母
6.{1,5}:匹配1-5个字符
配置正则带参路由:
index/urls.py
from django.urls import path, include,re_path # 导入 index 子应用的视图 from index import views urlpatterns = [ path('index_page/', views.index, name='index_page'), path('show/<int:id>/<str:username>/', views.show, name='show'), # 包含正则的路由字符串前需要加 r # 正则匹配部分需要() re_path(r'show/book/(?P<book_id>\d{4})/', views.show_book, name='show_book'), ]
路由对应的处理函数:
index/views.py
def show_book(request, book_id): return HttpResponse(f'书本编号:{book_id}')