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

Django1.8与DRF2.4.8中URL路由冲突问题求助

解决Django+DRF路由冲突问题

这个问题的根源在于Django的URL路由匹配规则:它会从上到下依次检查路由规则,只要找到第一个匹配的正则表达式,就会调用对应的视图,不会继续往下匹配,而且默认只匹配路径的开头部分,除非你用$指定匹配结尾。

看你的core.urls配置:

urlpatterns = [ 
    url(r'^user/edit/(?P<pk>[0-9]+)/$', core_view.ProfileEdit.as_view()), 
    url(r'^group/', core_view.GroupList.as_view()), 
    url(r'^groups/add/', core_view.GroupCreate.as_view()),
]

当你访问/machines/api/groups/add时,虽然你预期匹配groups/add/的规则,但Django会先检查第二个规则r'^group/'——这里大概率是你笔误把groups写成了group?或者如果你的GroupList本来就是对应groups/路径,那r'^groups/'会匹配groups/add的开头部分(groups/),直接触发GroupList视图,跳过后面的GroupCreate规则。

不管是哪种情况,都可以用下面两种方法解决:

方法一:调整路由顺序,把具体规则放在前面

把更具体的groups/add/规则移到通用的group/(或groups/)规则前面,这样Django会先匹配到精确的路径:

urlpatterns = [ 
    url(r'^user/edit/(?P<pk>[0-9]+)/$', core_view.ProfileEdit.as_view()), 
    # 具体规则提前
    url(r'^groups/add/', core_view.GroupCreate.as_view()), 
    url(r'^group/', core_view.GroupList.as_view()), 
]

方法二:给通用规则添加结尾符$,限制精确匹配

给GroupList的路由规则加上$,让它只匹配完全符合的路径(比如/machines/api/group/),而不会拦截groups/add这种子路径:

urlpatterns = [ 
    url(r'^user/edit/(?P<pk>[0-9]+)/$', core_view.ProfileEdit.as_view()), 
    # 添加$,仅匹配/group/路径
    url(r'^group/$', core_view.GroupList.as_view()), 
    url(r'^groups/add/', core_view.GroupCreate.as_view()),
]

另外,检查下项目级的URL顺序是没问题的——^machines/api/排在最前面,确保所有/machines/api/xxx的请求都会正确进入core.urls处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:02:51