开发者

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

目录
  • django路由匹配示例
  • 路由参数传递剖析
    • 1.利用正则分组匹配获取分组参数
    • 2.我们利用解包特性把对应的参数传递给视图
  • 总结

    django路由匹配示例

    下面是我们的示例代码:

    # 路由
    from django.urls import path, re_path
    
    from . import views
    
    urlpatterns = [
        path('articles/2003/', viandroidews.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是: articlesjs/2021/11/

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

    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")

    总结编程客栈

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜