Django URL名称空间“ admin”不是唯一的。适用于带斜线和不带斜线的端点

时间:2019-03-10 13:58:19

标签: python django url request

我收到此警告,我想摆脱它... 我的urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('admin', admin.site.urls),
    re_path(r'^(?P<Model>[A-Za-z]+)',
        GenericViewSet.as_view({'get': 'list', 'post': 'create'}),
    ) # aka model endpoint

]

我要实现的是请求/admin/admin/进入管理站点,其他任何请求都将传递到我的通用模型处理API。

问题在于,当我仅设置path('admin/', admin.site.urls)时,对/admin的请求落到模型端点,而当我仅设置path('admin', admin.site.urls)时,对/admin/的请求落到到模型端点。我知道为什么会这样,Django先遍历所有端点,然后再在末尾添加斜杠,然后再附加斜杠再遍历端点。

因此,我必须同时指定adminadmin/路径,以使对/admin/admin/的请求均落入管理站点,这导致警告出现...可能不应该发生...

我能以某种方式解决这个问题吗? (无需更改我想要的网址路径...)

p.s。我将APPEND_SLASH设置为True

编辑:

当我只使用

urlpatterns = [
    path('admin/', admin.site.urls),
]

/admin/admin/的请求均正确属于管理页面。

1 个答案:

答案 0 :(得分:1)

我现在看到了问题。如果您仅设置admin/而未设置admin,则它将与您的正则表达式匹配。

来自APPEND_SLASH documentation(重点是我):

  

...如果请求URL 不匹配,但URLconf中的任何模式且不以斜杠结尾,则会发出HTTP重定向以相同的URL,并附加斜杠。

因此,django不会将admin重定向到admin/,因为您的正则表达式模式与admin匹配,因为表达式的末尾没有斜杠。

您应在正则表达式模式中指定斜杠和美元符号,以便django将完整的URL与斜杠匹配。

这应该有效:

path('admin/', admin.site.urls),

re_path(r'^(?P<Model>[A-Za-z]+)/$', ...),