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
相关产品推荐
相关产品推荐

