精通Django 3 Web开发
上QQ阅读APP看书,第一时间看更新

3.5 路由变量与正则表达式

路由detail在路由地址里设置了路由变量id,通过动态改变路由变量id的数值就能生成相应的商品详细介绍页面,Django的路由变量分为字符类型、整型、slug和uuid,最为常用的是字符类型和整型。各个类型说明如下:

  • 字符类型:匹配任何非空字符串,但不含斜杠。如果没有指定类型,就默认使用该类型。
  • 整型:匹配0和正整数。
  • slug:可理解为注释、后缀或附属等概念,常作为路由的解释性字符。可匹配任何ASCII字符以及连接符和下画线,能使路由更加清晰易懂。比如网页的标题是“13岁的孩子”,其路由地址可以设置为“13-sui-de-hai-zi”。
  • uuid:匹配一个uuid格式的对象。为了防止冲突,规定必须使用“-”并且所有字母必须小写,例如075194d3-6885-417e-a8a8-6c931e272f00。

在路由中,如果使用函数path定义路由,那么路由变量则使用变量符号“<>”定义。在括号里面以冒号划分为两部分,冒号前面代表的是变量的数据类型,冒号后面代表的是变量名,变量名可自行命名,如果没有设置变量的数据类型,就默认为字符类型。比如路由变量<year>、<int:month>和<slug:day>,变量说明如下:

  • <year>:变量名为year,数据格式为字符类型,与<str:year>的含义一样。
  • <int:month>:变量名为month,数据格式为整型。
  • <slug:day>:变量名为day,数据格式为slug。

除了在路由地址设置变量外,Django还支持在路由地址外设置变量(路由的可选变量),比如在路由detail的路由中添加可选变量user,如下所示:

从上述代码可以看出,可选变量user的设置规则如下:

  • 可选变量只能以字典的形式表示。
  • 设置的可选变量只能在视图函数中读取和使用。
  • 字典的一个键值对代表一个可选变量,键值对的键代表变量名,键值对的值代表变量值。
  • 变量值没有数据格式限制,可以为某个实例对象、字符串或列表(元组)等。
  • 可选变量必须在视图函数(视图类)和参数name之间。

不管我们在路由地址中添加路由变量或者添加可选变量,只要路由信息里设置了变量,都必须在对应的视图函数里设置对应的函数参数,并且函数参数必须与路由信息的变量名一一对应。

虽然路由变量可以使用字符类型、整型、slug和uuid表示,但某些路由变量会因为业务需求或实际情况而设置一定的范围值,比如变量<int:year>,该变量代表年份,年份都是由4位数字组成,而整型的数值可以长达10位。为了进一步规范路由变量的数据格式,可以使用正则表达式限制路由变量的取值范围,示例如下:

路由的正则表达式是由路由函数re_path定义的,其作用是对路由变量进行截取与判断,正则表达式是以小括号为单位的,每个小括号的前后可以使用斜杠或者其他字符将其分隔与结束。以上述代码为例,分别将变量year、month和day以斜杠隔开,每个变量以一个小括号为单位,在小括号内,可分为3部分,以(?P<year>[0-9]{4})为例。

  • ?P是固定格式,字母P必须为大写。
  • <year>为变量名。
  • [0-9]{4}是正则表达式的匹配模式,代表变量的长度为4,只允许取0~9的值。