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

Written by

in

文章目录
  • 下面是我们的示例代码: # 路由 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/
  • 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: Django url 路由匹配过程详解 Django视图与URLs路由的使用方式 Django在urls.py利用函数path()配置路由时传递参数给调用的视图函数的方法(推荐) Python中Django的路由配置详解 Django路由Path方法的实现 Django url.py path name同一app下路由别名定义 Django框架之路由用法
  • 目录
    • django路由匹配示例
    • 路由参数传递剖析
      • 1.利用正则分组匹配获取分组参数
      • 2.我们利用解包特性把对应的参数传递给视图
    • 总结

      下面是我们的示例代码:

      # 路由
      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/

      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'}

      # 伪代码,调用视图,
      # 这中情况可能会更友好,直接通过关键词方式调用,不影响我们方法定义的时候参数位置
      # 但是实际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")

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

      您可能感兴趣的文章:

      • Django url 路由匹配过程详解
      • Django视图与URLs路由的使用方式
      • Django在urls.py利用函数path()配置路由时传递参数给调用的视图函数的方法(推荐)
      • Python中Django的路由配置详解
      • Django路由Path方法的实现
      • Django url.py path name同一app下路由别名定义
      • Django框架之路由用法

      站内搜索