django 3. 路由初探

路由称为URL(Uniform Resource Locator,统一资源定位符),也可以称为URLconf,是对可以从互联网上得到的资源位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的路由,用于指出网站文件的路径位置。简单地说,路由可以视为我们常说的网址,每个网址代表不同的网页。

路由基本编写规则如下(以下方代码块为例)

# 导入内置Admin功能模块
from django.contrib import admin
# 导入Django的路由功能模块
from django.urls import path,re_path,include
# 导入项目应用index
from index import views
# 配置媒体文件夹media
from django.views.static import serve
from django.conf import settings
# urlpattern:代表整个项目的路由集合,以列表格式表示,每个元素代表一条路由信息
urlpatterns = [
    ''' 设定Admin的路由信息。其中'admin/'代表127.0.0.1:8000/admin的路由地址,	 	admin后面的斜杠是路径分隔符,其作用等同于计算机文件目录的斜杠符号;
    admin.site.urls指向内置Admin功能所定义的路由信息,可在python目录			\Lib\site-packages\django\contrib\admin\site.py找到具体定义过程。    
    '''
    path('admin/', admin.site.urls),
    # 路由地址为'\',即127.0.0.1:8000,通常是网站的首页;路由函数include将该路由信息分发给index的urls处理
    path('',include('index.urls','index')),
]

路由文件urls.py的路由定义规则是相对固定的,路由列表由urlpatterns表示,每个列表元素代表一条路由。路由是由Django的path函数定义的,该函数的第一个参数是路由地址,第二个参数是路由所对应的处理函数(视图函数或视图类),这两个参数是路由定义的必选参数。

路由的变量类型有字符类型、整型、slug和uuid,最为常用的是字符类型和整型。各个类型说明如下。

  • 字符类型:匹配任何非空字符串,但不包含斜杠。如果没有指定类型,就默认使用该类型。

  • 整型:匹配0和正整数。

  • slug:可理解为注释,后缀或附属等概念,常作为路由的解释性字符,可匹配任何ASCII字符以及连接符和下划线,能使路由更加清晰易懂。比如网页的标题是“13岁的孩子”,其路由地址可以设置为"13-sui-de-hai-zi"。

  • uuid:匹配一个uuid格式的对象。为了防止冲突,规定必须使用破折号并且所有字母必须小写,例如075194d3-6885-417ee-a8a8-6c931e272f00。

除了在路由地址设置变量外,django还支持在路由地址外设置变量(路由的可选变量),比如在路由函数path或re_path中设置第三个参数,其内容为{'month':'2019/10/10'},该参数的设置规则如下:

  • 参数只能以字典的形式表示。

  • 设置的参数只能在视图函数中读取和使用。

  • 字典的一个键值对代表一个参数,键值对的键代表参数名,键值对的代表参数值。

  • 参数值没有数据格式限制,可以为某个对象、字符串或列表(元组)等。

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

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

命名空间namespace可以为我们快速定位某个项目应用的urls.py,再结合路由命名name就能快速地从项目应用的urls.py找到某条路由的具体信息,这样就能有效管理整个项目的路由列表。

django的路由命名name是对路由进行命名,其作用是在开发过程中可以在视图或模板等其他功能模块里使用路由命名name来生成路由地址。

模板语法url的参数设置与路由定义是相互关联的,具体说明如下:

  • 若路由地址存在变量,则模板语法url需要设置响应的参数值,参数值之间使用空格隔开。
  • 若路由地址不存在变量,则模板语法url只需设置路由命名name即可,无须设置额外的参数。
  • 若路由地址的变量与模板语法url的参数数量不相同,则在浏览器访问网页的时候会提示NoReverseMatch at的错误信息

django的反向解析主要由函数reverse和resolve实现,函数reverse是通过路由命名或可调用视图对象来生成路由地址的;函数resolve是通过路由地址来获取路由对象信息的。在使用这两个函数时,需要注意两者所传入的参数类型和返回值的数据类型。

django的网页重定向有两种方式:第一种方式时路由重定向;第二种方式是自定义视图的重定向。两种重定向方式各有千秋,前者是使用django内置的视图类RedirectView实现的,默认支持HTTP的GET请求;后者是在自定义视图的响应状态设置重定向,能让开发者实现多方面的开发需求。

posted @ 2022-04-05 19:07  我是一言  阅读(78)  评论(0编辑  收藏  举报