Django正则URL匹配实现流程解析
本文解析Django中通过正则表达式配置URL匹配的方法,对比传统动态URL与静态URL在SEO上的差异。详细演示如何利用re_path实现顺序传参(*args)与关键字传参(**kwargs),并说明后者在参数位置变换时的稳定性优势,帮助开发者优化路由配置。
Django正则URL匹配实现流程解析
一、引子
在day17的作业环节中,查看主机详细信息时,我们采用在URL中拼接参数的方式。对应的URL配置为匹配path("detail/", views.detail)。

此时生成的URL类似于http://127.0.0.1:8000/detail/?nid=2。今天我们将学习如何生成类似http://127.0.0.1:8000/detail-3.html这样的URL格式。
据称,以往使用的方式在搜索引擎优化(SEO)中被视为动态页面,而新的静态URL格式则被视为静态页面。这种区别可能在进行搜索优化时带来一定优势。
Django正则URL匹配实战示例
二、开搞栗子
暂时忽略数据库操作,先在views模块中创建一个用户字典用于测试。
2.1 动态页面的栗子
views代码:
info_dic={
1:{"name":"zhangsan","email":"zhangsan@163.com","age":22},
2:{"name":"lisi","email":"lisi@163.com","age":27},
3:{"name":"wangwu","email":"wangwu@163.com","age":29},
4:{"name":"laoliu","email":"laoliu@163.com","age":30},
5:{"name":"chenpi","email":"chenpi@163.com","age":32},
}
def index(request):
return render(request,"index.html",{"info_dic":info_dic})
def detail(request):
nid=request.GET.get("nid")
print(nid,type(nid))
info=info_dic.get(int(nid))
print(info)
return render(request,"detail.html",{"info":info})
urls配置

前端index.html页面:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>用户信息</h1>
<ul>
{% for k,v in info_dic.items %}
<li><a target="_blank" href="/detail/?nid={{ k }}" rel="external nofollow" >{{ v.name }}</a></li>
{% endfor %}
</ul>
</body>
</html>
前端detail页面:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>用户详细信息</h1>
<ul>
<li>name:{{ info.name }}</li>
<li>email:{{ info.email }}</li>
<li>age:{{ info.age }}</li>
</ul>
</body>
</html>
运行结果:


2.2 下面使用正则表达式进行URL匹配,实现静态页面效果:
urls配置:

views视图函数:
直接在函数定义中通过形参nid接收参数,无需像之前那样从request.method中手动提取。

运行结果:

上述示例表明,参数是通过函数形参传递的,类似于定义函数时的位置参数。
接下来再举一个例子进行验证:




当参数位置发生变换后,获取到的数值也随之改变。

Django URL分组传参技巧
三、分组传参
在上述示例中,如果不进行分组,参数就像函数的位置参数一样,依赖顺序,灵活性较差。
显然,这种方式在实际调用中并不方便。因此,如果使用关键字参数,就需要在URL匹配中进行分组处理。
下面通过示例验证,即使交换nid和uid的位置,打印结果保持一致。

位置参数可以通过*args获取,而关键字参数则通过**kwargs获取。

Django正则URL匹配总结
四、总结
路由系统:URL配置
- 普通URL匹配:re_path('^index/', view.index),re_path('^home/', view.Home.as_view())
- 顺序传参:re_path(r'^detail-(\d+)-(\d+).html/', views.detail),通过*args接收参数。
- 关键字传参:re_path(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html/', views.detail),通过**kwargs接收参数,推荐使用此方式。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













