URL路由的配置与使用

本文最后更新于:2 年前

URL在MTV中的作用

URL 简介

通过 URL(Uniform Resource Locator,统一资源定位符)可以访问互联网上的资源———用户通过浏览器向指定URL发起请求,Web服务器接收请求并返回用户请求的资源,因此可以将URL视为用户与服务器之间交互的桥梁。

作为一个优秀的Web框架,Django提供了配置URL的路由系统,通过该路由系统,开发人员可以设计出简洁、优雅的URL。

HTTP请求处理流程

Django 框架的路由系统接收用户通过浏览器发来的 HTTP 请求,为请求分派视图,以处理请求并返回响应。结合Django项目进行分析,这一处理HTTP请求的具体流程如下图所示。

URL配置项

一个项目允许有多个 urls.py,但 Django 需要一个 urls.py 作为入口,这个特殊的 urls.py 就是根URLconf(根路由配置),它由settings.py 文件中的 ROOT_URLCONF 指定

指定mydjango目录下的urls.py作为根URLconf

以上示例通过 ROOT_URLCONF 指定了mydjango目录下的 urls.py 作为根URLconf。

URL路由流程

为保证项目结构清晰,开发人员通常在 Django 项目的每个应用下创建urls.py文件,在其中为每个应用配置子URL

路由系统接收到 HTTP 请求后,先根据请求的 URL 地址匹配根URLconf,找到匹配的子应用,再进一步匹配子URLconf,直到匹配完成。

这里URL匹配时是按先后顺序进行匹配的,找到第一个匹配时,停止查找。

Django路由不考虑 HTTP 请求方式,仅根据URL进行路由,只要URL相同,无论是POST、GET哪种请求方式都指向同一个操作函数。

URL解析函数

URL有两个解析函数:

  • path() :用来处理字符串。

  • re_path() :用来处理正则表达式。

path() 路由函数

1
path(route, view, kwargs=None, name=None
  • route:URL或URL模式,Django定义的URL转换语法。
  • view:处理视图函数的名称,或 include() 类。
  • kwargs:向处理函数提供的额外参数,以字典形式表示。
  • name:给URL模式的命名。

re_path()函数

1
re_path(route, view, kwargs=None, name=None)

re_path() 函数的参数 route 接收一个正则表达式,其余参数与 path() 函数中参数的作用相同。

路由的格式和转换

Django 支持三种方式表达 route:

  • 精确字符串格式articles/2000/
  • django的转换格式:<类型:变量名>,例如:articles/<int:year>/
  • 正则表达式articles/(?P<year>[0-9]{4})/

精确字符串格式

  • 一个精确URL匹配一个视图处理函数

  • 最简单的形式,适合静态URL的响应

  • URL字符串不以 “/” 开头,但以 “/” 结尾


articles/2000/ 为例,改变路由转换器的类型,观察路由的变化:

  1. urls.py 中配置 URL解析函数

  2. views.py 中配置对应的处理函数

  3. 启动服务器,在浏览器中访问

Django的转换格式

  • 一个URL模板,匹配URL同时在其中获的一批变量作为参数
  • 常用形式,目的是通过URL进行参数获取和传递
  • 采用 <类型:变量名> 格式获取参数

内置路由转换器可以显式地指定路由中参数的数据类型,Django中内置了5种路由转换器,分别为str、int 、slug 、uuid 和 path 。

  • str:匹配任何非空字符串,但不包含路由分隔符“/”。如果URL中没有指定参数类型,默认使用该类型。
  • int:匹配0或任何正整数。
  • slug:匹配由字母、数字、连字符和下画线组成的URL。
  • uuid:匹配一个uuid。为了防止多个URL映射到同一页面中,该转换器必须包含连字符,且所有字母均为小写,例:6d25a684-9558-11e9-aa94-efccd7a0659b。
  • path:匹配任何非空字符串,包括路由分隔符“/”。

articles/<str:name>,<int:age>/ 为例,改变路由转换器的类型,观察路由的变化:

  1. urls.py 中配置 URL解析函数

  2. views.py 中配置对应的处理函数

  3. 启动服务器,在浏览器中访问

虽然内置的路由转换器能够处理绝大部分应用场景,但在实际开发中可能需要匹配一些复杂的参数,如限制路由长度的参数,这时就需要开发人员自定义路由转换器。

使用正则表达式匹配URL

若URL中包含如文件路径、工牌号这类不规则的信息,则使用路由转换器无法很好地匹配URL模式,此时可以使用正则表达式定义路由模式。若要使用正则表达式匹配URL,则可以使用 re_path() 函数

使用 re_path() 函数匹配包含正则表达式的URL有两种方式:

  • 简单形式(未命名正则表达式)

    若正则表达式只通过小括号 “()” 来捕获URL的参数,但未为其命名,则它是一个未命名正则表达式,此时捕获的参数并将其以位置参数形式传递给对应视图。例:articles/([0-9]{4})/

  • 命名正则表达式

    命名正则表达式格式为:(?P<name>pattern),其中 name 表示分组名,pattern 表示匹配的正则表达式。URL匹配成功后,捕获到的参数会作为关键字参数传递给对应的视图,因此视图中的形式参数必须和正则表达式中的分组名相同。例:articles/(?P<year>[0-9]{4})/


以年月日日期格式为例,使用命名正则表达式的方式,改变路由转换器的类型,观察路由的变化:

  1. urls.py 中配置 URL解析函数

    以上正则表达式只作示范,并非准确,依然能匹配如13月32日的错误日期。

  2. views.py 中配置对应的处理函数

  3. 启动服务器,在浏览器中访问