URL路由的配置与使用
本文最后更新于:2 年前
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 指定。
以上示例通过 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 |
|
- route:URL或URL模式,Django定义的URL转换语法。
- view:处理视图函数的名称,或 include() 类。
- kwargs:向处理函数提供的额外参数,以字典形式表示。
- name:给URL模式的命名。
re_path()函数
1 |
|
re_path() 函数的参数 route 接收一个正则表达式,其余参数与 path() 函数中参数的作用相同。
路由的格式和转换
Django 支持三种方式表达 route:
- 精确字符串格式:
articles/2000/
- django的转换格式:<类型:变量名>,例如:
articles/<int:year>/
- 正则表达式:
articles/(?P<year>[0-9]{4})/
精确字符串格式
一个精确URL匹配一个视图处理函数
最简单的形式,适合静态URL的响应
URL字符串不以 “/” 开头,但以 “/” 结尾
以 articles/2000/
为例,改变路由转换器的类型,观察路由的变化:
在 urls.py 中配置 URL解析函数:
在 views.py 中配置对应的处理函数:
启动服务器,在浏览器中访问
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>/
为例,改变路由转换器的类型,观察路由的变化:
在 urls.py 中配置 URL解析函数:
在 views.py 中配置对应的处理函数:
启动服务器,在浏览器中访问
虽然内置的路由转换器能够处理绝大部分应用场景,但在实际开发中可能需要匹配一些复杂的参数,如限制路由长度的参数,这时就需要开发人员自定义路由转换器。
使用正则表达式匹配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})/
以年月日日期格式为例,使用命名正则表达式的方式,改变路由转换器的类型,观察路由的变化:
在 urls.py 中配置 URL解析函数:
以上正则表达式只作示范,并非准确,依然能匹配如13月32日的错误日期。
在 views.py 中配置对应的处理函数:
启动服务器,在浏览器中访问
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!