You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django相似URL模式匹配问题:多产品对比路由访问返回404

问题根源

Django的URL路由是从上到下按顺序匹配,命中第一个符合规则的路由就会终止匹配。
你当前配置的冲突点在于:Django默认的slug路径转换器允许匹配连字符-,当你访问三产品对比路径(比如comparison/foo-vs-bar-vs-baz/)时,第一个路由会把foo识别为slug1,bar-vs-baz识别为slug2,直接命中双产品对比路由,后续的三产品路由永远不会被触发,而双产品视图接收到不符合预期的参数后就会返回404。

解决建议
  • 方案1(最简单,无侵入):调整两个路由的书写顺序,把三产品对比的路由放在双产品对比路由前面
# 先写规则更复杂、匹配条件更严格的路由
path('comparison/<slug:slug1>-vs-<slug:slug2>-vs-<slug:slug3>/', views.compare_three_products, name="compare_three_products"),
path('comparison/<slug:slug1>-vs-<slug:slug2>/', views.compare_two_products, name="compare_two_products"),

只要URL符合三产品的格式就会优先命中,不符合才会往下匹配双产品路由,无需修改其他逻辑。

  • 方案2(更严谨,避免后续扩展冲突):使用re_path写正则路由,明确限制slug部分不能包含-vs-字符串,从根本上避免slug吞掉后续匹配规则的问题
from django.urls import re_path

re_path(r'^comparison/(?P<slug1>[-\w]+)-vs-(?P<slug2>[-\w]+)-vs-(?P<slug3>[-\w]+)/$', views.compare_three_products, name="compare_three_products"),
re_path(r'^comparison/(?P<slug1>[-\w]+)-vs-(?P<slug2>[-\w]+)/$', views.compare_two_products, name="compare_two_products"),

如果后续需要扩展四产品、五产品对比,这个方案也不会出现匹配冲突。

  • 方案3(可读性最好,长期维护更方便):调整URL结构,用斜杠分隔不同参数,彻底避免匹配歧义
path('comparison/<slug:slug1>/vs/<slug:slug2>/', views.compare_two_products, name="compare_two_products"),
path('comparison/<slug:slug1>/vs/<slug:slug2>/vs/<slug:slug3>/', views.compare_three_products, name="compare_three_products"),

斜杠是Django路由默认的参数分隔边界,slug不会跨斜杠匹配,完全不会出现路由匹配错乱的问题,URL的语义也更清晰。

内容的提问来源于stack exchange,提问作者DEV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 11:36:04