it编程 > 编程语言 > 正则表达式

django中路由匹配中正则提取参数机制详解

34人参与 2025-05-14 正则表达式

django路由匹配示例

下面是我们的示例代码:

# 路由
from django.urls import path, re_path

from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    
    # 2.0以前版本 是url,现在是re_path 主要是通过正则来匹配
    re_path(r'^articles/(?p<year>[0-9]{4})/(?p<month>[0-9]{2})/$', views.month_archive),
]

# 视图层
def month_archive(request,year,month):
    pass

路由参数传递剖析

django是如何把路由参数获取并传递给视图呢?

从字面上我们可以看出来来,【正则路】所以这里面它巧妙的利用了正则的分组特性,并通过参数解包特性来完成,下面我们演示下大致的流程

假设:我们访问了的path是: articles/2021/11/

1.利用正则分组匹配获取分组参数

import re
path = "articles/2021/11/"
# 使用  正则去匹配路由
res = re.search(r'^articles/(?p<year>[0-9]{4})/(?p<month>[0-9]{2})/$',path)

if not res:
    print("匹配失败!")
else:
    # 提取path参数,利用分组
    kwargs = res.groupdict()

利用分组我们就可以正常的把里面path参数获取到:

{'year': '2021', 'month': '11'}

2.我们利用解包特性把对应的参数传递给视图

# 伪代码,调用视图,
# 这中情况可能会更友好,直接通过关键词方式调用,不影响我们方法定义的时候参数位置
# 但是实际django利用的是位置参数传递
month_archive(request,**kwargs)

# 上面的就等价于 month_archive(request, year="2021", month="11")


# 下面是位置参数传递,注意这是在正则提取的结果上进一步操作
# 1. 提取分组结果
args = res.groups()  #('2021', '11')
# 2. 调用视图,这样就限制了其位置
month_archive(request,*args)

# 上面的代码等价于  month_archive(request,"2011","11")

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

使用Django和Ansible实现自动化部署方式

05-14

SQL中的字符串正则表达式常见示例代码

05-18

Nginx正反向代理与正则表达式详解

05-06

如何在Ubuntu系统中有效管理镜像磁盘空间

05-19

nginx访问路径映射服务器资源文件

05-19

正则表达式r前缀使用指南及如何避免常见错误

05-19

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论