Django中如何从urlpatterns获取URL变量值并传递到视图函数
Django路由匹配传递URL参数问题解决方案
问题根因
你当前拿到空值的核心原因是:re_path的正则表达式没有设置命名捕获组,Django只会将正则中捕获的内容作为参数传递给视图函数,你现有的正则只有匹配逻辑,没有捕获规则,所以视图的url参数始终读取默认空值。
修复步骤
1. 修改路由正则
给你要捕获的URL部分添加命名捕获组(?P<url>正则规则),代码修改如下:
from django.urls import path, re_path from . import views urlpatterns = [ path('', views.index), # 命名捕获组将匹配到的URL内容赋值给url参数传给视图 # ^匹配路径开头,/?$允许结尾可选带/兼容Django默认尾斜杠逻辑 re_path(r'^(?P<url>https?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)/?$', views.index_traductor), ]
如果你需要匹配的路径是/url=https://xxx的格式,将正则调整为:
re_path(r'^url=(?P<url>https?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)/?$', views.index_traductor),
2. 特殊场景兼容说明
- 如果匹配时遇到尾斜杠自动跳转问题,可以在
settings.py中添加配置APPEND_SLASH = False关闭自动补全尾斜杠逻辑 - 该路径匹配方式无法处理目标URL带查询参数的场景:路径中的
?会被Django识别为查询参数分隔符,后续内容不会被捕获到url参数中。如果需要支持带查询参数的目标URL,更稳妥的实现方式是将目标URL做URL编码后放在请求查询参数中,比如访问地址为https://place.com/traductor?target_url=https%3A%2F%2Fwww.google.es%2Fsearch%3Fq%3Dtest,此时不需要配置复杂正则,在视图中直接通过request.GET.get('target_url')就能拿到完整的目标地址。
内容的提问来源于stack exchange,提问作者Javi
相关产品推荐
相关产品推荐

