Django路由冲突:blog详情页URL匹配到games应用视图报错如何解决
Django路由匹配错误解决方案
问题根本原因
Django路由遵循从上到下优先匹配的规则,再加上配置存在两处错误,才导致匹配错乱:
- 根路由中
path('',include('games.urls'))放在最前面,空前缀会匹配所有根路径下的请求,games应用的子路由<slug:platform>/<slug:slug>是两层slug通配符,会把形如/blog/xxx的请求,识别为platform=blog、slug=xxx,抢先匹配到games的oyun视图 - blogs应用的子路由配置错误,path路径不需要加开头的斜杠,
path('/<slug:slug>',...)会导致实际匹配路径为blog//xxx,正常访问的/blog/xxx根本无法匹配到blog的详情路由
修复步骤
- 第一步:修正blogs应用子路由写法,删除路径开头的斜杠,建议末尾加斜杠符合Django默认
APPEND_SLASH配置规范:
# blogs/urls.py path('', views.blogs, name='blog'), # 删掉开头的/,末尾加/ path('<slug:slug>/', views.blog_id, name='blog_id'),
- 第二步:修正根路由的配置,两个方案选一个即可:
- 方案1(推荐,完全避免路由冲突):给games应用也加统一前缀,避免空前缀抢占所有匹配:
# 根urls.py # games路由统一加games前缀 path('games/',include('games.urls')), # blog路径末尾加/ path('blog/',include('blogs.urls')),- 方案2(如果必须要games路由直接挂在根路径):调整路由顺序,把更具体的blog路由放在前面:
# 根urls.py # 把更具体的路由放前面 path('blog/',include('blogs.urls')), path('',include('games.urls')), - 第三步(可选,优化规范):给两个应用配置路由命名空间,避免后续反向解析路由名冲突:
# 根urls.py path('blog/',include(('blogs.urls', 'blogs'), namespace='blogs')), path('',include(('games.urls', 'games'), namespace='games')),
后续反向解析路由时用{% url 'blogs:blog_id' slug=xxx %}格式即可。
内容的提问来源于stack exchange,提问作者cvsrt
相关产品推荐
相关产品推荐

