路由称为URL(Uniform Resource Locator
,统一资源定位符),也可以称为URLconf
,是对可以从互联网上得到的资源位置和访问方法的一种简洁的标识,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的路由,用于支出网站文件的路径位置。简单的说,路由可视为我们常说的网址,每个网址代表不同的网页。
路由基本编写规则如下(以MyDjango
文件夹的urls.py
为例)。
from django.contrib import admin
:导入内置Admin
功能模块。from django.urls import path, include
:导入Django
的路由功能模块。urlpatterns
:代表整个项目的路由集合,以列表格式标识,每个元素代表一条路由信息。path('admin/', admin.site.urls)
:设定Admin
的路由信息。其中'admin/'
代表127.0.0.1:8000/admin
的路由地址,admin
后面的斜杠是路径分隔符,其作用等同于计算机文件目录的斜杠符号;admin.site.urls
指向内置Admin
功能所定义的路由信息,可在Python
目录Lib\site-packages\django\contrib\admin\sites.py
找到具体定义过程。path('', include('index.urls'))
:路由地址为"\",即127.0.0.1:8000
,通常是网站的首页;路由函数include
将该路由信息分发给index
的urls.py
处理。
路由文件urls.py
的路由定义规则是相对固定的,路由列表由urlpatterns
表示,每个列表元素代表一条路由。路由是由Django
的path
函数定义的,该函数的第一个参数是路由地址,第二个参数是路由所对应的处理函数(视图函数或视图类),这两个参数是路由定义的必选参数。
路由的变量类型由字符类型、整型、slug
和uuid
,最为常用的是字符类型和整型。各个类型说明如下:
- 字符类型:匹配任何非空字符串,但不含斜杠。如果没有制定类型,就默认使用该类型。
- 整型:匹配0和正整数。
slug
:可理解为注释、后缀或附属等概念,常作为路由的解释性字符,可匹配任何ASCII
字符以及连接符和下画线,能使路由更加清晰易懂。比如网页的标题是『13岁的孩子』,其路由地址可以设置为"13-sui-de-hai-zi
"。uuid
:匹配一个uuid
格式的对象。为了防止冲突,规定必须使用破折号并且所有字母必须小写,例如075194d3-6885-417e-a8a8-6c931e272f00
。
除了在路由地址设置变量外,Django
还支持在路由地址外设置变量(路由的可选变量),比如在路由函数path
或re_path
中设置第3个参数,其内容{'month':'2019/10/10'}
,该参数的设置规则如下:
- 参数只能以字典的形式表示。
- 设置的参数只能在视图函数中读取和使用。
- 字典的一个键值对代表一个参数,键值对的键代表参数名,键值对的值代表参数值。
- 参数值没有数据格式限制,可以为某个对象、字符串或列表(元组)等。
路由得正则表达式是路由函数re_path
定义得,其作用是对路由变量进行截取与判断,正则表达式是以小括号为单位的,每个小括号的前后可以使用斜杠或者其他字符将其分隔与结束。以上述代码为例,分别将变量year
、month
和day
以斜杠隔开,每个变量以一个小括号为单位,在小括号内,可分为3部分(以(1?P<year>[0-9]{4}
)为k例):
?P
是固定格式,字母P必须为大写。- 为变量名。
[0-9]
是正则表达式的匹配模式,代表变量的长度为4,只允许取0~9的值。
命名空间namespace
可以为我们快速定位某个项目应用的urls.py
,再结合路由命名name
就能快速地从项目应用的urls.py
找到某条路由的具体信息,这样就能有效管理整个项目的路由列表。
Django
的路由命名name
是对路由进行命名,其作用是再开发过程中可以在视图或模板等其他功能模块里使用路由命名name
来生成路由地址。
模板语法url
的参数设置与路由定义是相互关联的,具体说明如下:
- 若路由地址存在变量,则模板语法
url
需要设置相应的参数值,参数值之间使用空格隔开。 - 若路由地址不存在变量,则模板语法
url
只需设置路由命名name
即可,无须设置额外的参数。 - 若路由z地址的变量与模板语法
url
的参数数量不相同,则在浏览器访问网页的时候会提示NoReverseMatch at
的错误信息。
Django
的反向解析主要由函数reverse
和resolve
实现,函数reverse
是通过路由命名或调用视图对象来生成路由地址的;函数resolve
是通过路由地址来获取路由对象信息的。在使用这两个函数时,需要注意两者所传入的参数类型和返回值的数据类型。
Django
的网页重定向有两种方式:第一种方式是路由重定向;第二种方式是自定义视图的重定向。两种重定向方式各有优点,前者是使用Django
内置的视图类RedirectView
实现的,默认支持HTTP
的GET
请求;后者是在自定义视图的响应状态设置重定向,能让开发者实现多方面的开发需求。