Django re_path路由配置导致多App详情页渲染错误问题
问题成因
Django URL路由采用从上到下优先匹配的规则,你遇到的冲突本质是正则匹配规则不严谨+路由挂载顺序共同导致的:
- 根路由配置中,你将
news应用挂载到了根空路径'',这意味着所有请求都会优先尝试匹配news应用下的路由规则,匹配失败才会继续向下匹配后续的blogs路由。 - 你在
news和blogs应用中使用的re_path正则都没有添加开头锚点^,比如news的路由正则r'(?P<news_type>[\w-]+)/(?P<pk>[0-9]+)$',只要URL的结尾部分符合「两段内容,第二段为数字」的格式就会被匹配成功。
比如你访问/blogs/技术/1时,请求会先进入news的路由匹配逻辑,正则会把URL结尾的技术/1识别为符合规则的参数,将news_type赋值为技术、pk赋值为1,直接返回news应用的内容,不会继续匹配后续的blogs前缀路由。
修复方案
你可以任选以下任意一种方案解决问题:
- 方案1:给所有
re_path正则添加开头锚点^,强制匹配规则必须作用于URL的起始位置,修改后示例:
# news应用urls.py re_path(r'^(?P<news_type>[\w-]+)/(?P<pk>[0-9]+)$', newspage.as_view(), name='newspage') # blogs应用urls.py re_path(r'^(?P<blog_type>[\w-]+)/(?P<pk>[0-9]+)$', blogspage.as_view(), name='blogspage')
添加^后,正则要求去掉前缀后的剩余URL必须整体完全匹配两段格式,/blogs/技术/1去掉根空前缀后是三段内容,无法匹配news应用的两段正则,就会继续向下匹配到blogs的路由规则。
- 方案2:给所有应用配置独立的路由前缀,不要将任意应用挂载到根空路径,比如修改根路由:
urlpatterns = [ path('admin/', admin.site.urls), path('news/', include('news.urls')), path('blogs/',include('blogs.urls')), ]
该方案从根源上避免不同应用的URL前缀冲突,也是Django官方推荐的多应用路由规范。
- 方案3:如果你确实需要将
news应用挂载到根路径,调整根路由的顺序,将挂载到根路径的应用路由放在所有路由的最后:
urlpatterns = [ path('admin/', admin.site.urls), path('blogs/',include('blogs.urls')), # 根路径路由放在最后,避免截胡其他前缀的路由 path('', include('news.urls')), ]
这样优先级更高的/blogs/前缀路由会先匹配成功,不会被后面的根路径路由拦截。
内容的提问来源于stack exchange,提问作者Hello World
相关产品推荐
相关产品推荐

