(四)路由的定义规则
(1)每个urls.py文件的路由地址必须在列表urlpatterns里定义,换句话说,每个urls.py必须设有一个列表urlpatterns,该列表是用于定义路由信息。
(2)每条路由是由函数path定义,函数path设置了3个参数:第一个参数是设置具体的路由地址;第二个参数是指向项目应用的views.py的某个视图函数或视图类,负责处理路由的业务逻辑;第三个参数为name='XXX’,这是函数path的可选参数,该参数是命名路由地址。
(3)如果函数path第二个参数使用内置函数include,该路由是实现路由分发功能。也就是说,如果函数path的第二个参数是函数include,该路由为路由分发;如果函数path的第二个参数是项目应用的views.py的视图类或视图函数,该路由为网站的路由地址。
(4)函数path是Django 2.0以上版本定义的内置函数,如果开发环境是Django 1.X版本,那么路由定义应使用函数url。从参数的角度分析,函数path和函数url的参数设置是相同的只不过函数url定义的路由地址需设置路由符号^和s。^代表当前路由地址的相对路径;s代表当前路由地址的终止符。1.x和2.x版本逐渐淘汰,定义省略。
(五)路由变量与正则表达式
1、路由变量类型
路由detail在路由地址里设置了路由变量id,通过动态改变路由变量id的数值就能生成相应的商品详细介绍页面,Django的路由变量分为字符类型、整型、slug和uuid,最为常用的是字符类型和整型。各个类型说明如下:
字符类型:匹配任何非空字符串,但不含斜杠。如果没有指定类型,就默认使用该类型。
整型:匹配0和正整数。
slug:可理解为注释、后缀或附属等概念,常作为路由的解释性字符。可匹配任何ASCII字符以及连接符和下划线,能使路由更加清晰易懂。比如网页的标题是“13岁的孩子” ,其路由地址可以设置为“13-sui-de-hai-zi”
uuid: 匹配一个uuid格式的对象。为了防止冲突,规定必须使用"-”并且所有字母必须小写,例如075194d3-6885-417e-a8a8-6c931e272100.
2、路由变量定义
在路由中,如果使用函数path定义路由,那么路由变量则使用变量符号“<>”定义。在括号里面以冒号划分为两部分,冒号前面代表的是变量的数据类型,冒号后面代表的是变量名,变量名可自行命名,如果没有设置变量的数据类型,就默认为字符类型。比如路由变量<year>、<int:month>和<slug:day>,变量说明如下:
<year> :变量名为 year,数据格式为字符类型,与<str:year>的含义一样。
<int:month>:变量名为 month,数据格式为整型。
<slug:day>:变量名为 day,数据格式为 slug。
3、路由的可选变量
除了在路由地址设置变量外, Django还支持在路由地址外设置变量(路由的可选变量),比如在路由detail的路由中添加可选变量user,如下所示:
# 项目应用 commodity 的 urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('.html', commodityView, {'user': 'admin'}, name='commodity'),
path('/detail.<int:id>.html', detailView, name='detail'),
]
从上述代码可以看出,可选变量user的设置规则如下:
可选变量只能以字典的形式表示。
设置的可选变量只能在视图函数中读取和使用。
字典的一个键值对代表一个可选变量,键值对的键代表变量名,键值对的值代表变量值。
变量值没有数据格式限制,可以为某个实例对象、字符串或列表(元组)等。
可选变量必须在视图函数(视图类)和参数 name 之间。
不管我们在路由地址中添加路由变量或者添加可选变量,只要路由信息里设置了变量, 都必须在对应的视图函数里设置对应的函数参数,并且函数参数必须与路由信息的变量名一一对应。
任务1:如何在视图函数里访问可选路由变量?在控制台输出路由变量值
任务2:如何在视图函数里访问可选路由变量?在模板页面输出路由变量值
4、使用正则表达式给路由变量设定范围
虽然路由变量可以使用字符类型、整型、slug 和 uuid 表示,但某些路由变量会因为业务需求或实际情况而设置一定的范围值,比如变量,该变量代表年份,年份都是由4位数字组成,而整型的数值可以长达10位。为了进一步规范路由变量的数据格式,可以使用正则表达式限制路由变量的取值范围,示例如下:
# 某项目应用的 urls.py
from django.urls import re_path
from . import views
urlpatterns = [
re_path('(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2}).html', views.mydate)
]
路由的正则表达式是由路由函数 re_path 定义的,其作用是对路由变量进行截取与判断,正则表达式是以小括号为单位的,每个小括号的前后可以使用斜杠或者其他字符将其分隔与结束。
以上述代码为例,分别将变量 year、month 和 day 以斜杠隔开,每个变量以一个小括号为单位,在小括号内,可分为3部分,以(?P<year>[0-9]{4})为例。
?P 是固定格式,字母 P 必须为大写。
<year> 为变量名。
[0-9]{4} 是正则表达式的匹配模式,代表变量的长度为 4,只允许取 0~9 的值。
任务:针对首页index.html,路径包含年月日,如果正确,就显示在页面上