【问题标题】:Django URL namespace 'admin' isn't unique. for endpoints with and without slashDjango URL 命名空间 'admin' 不是唯一的。对于带和不带斜线的端点
【发布时间】:2019-07-31 23:22:35
【问题描述】:

我收到此警告,我想摆脱它... 我的 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/ 的请求都落入管理站点,这会导致出现警告......这可能不应该正在发生...

我可以绕过这个吗? (不改变我想要的 url 路径...)

附言我已将 APPEND_SLASH 设置为 True

编辑:

当我只使用时

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

/admin/admin/ 的请求都正确落入管理页面。

【问题讨论】:

  • Django 默认将非斜线 url 重定向到斜线 url,即 /admin/admin/。你不需要两个网址。请参阅APPEND_SLASH 设置。
  • 问题是当我只设置路径('admin/', admin.site.urls) 时,对/admin 的请求落到模型端点并且当我只设置路径('admin' , admin.site.urls),对 /admin/ 的请求落到模型端点。这不应该发生......这可能是真正的问题。

标签: python django url request


【解决方案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]+)/$', ...),

【讨论】:

  • 问题是当我只设置路径('admin/', admin.site.urls)时,对 /admin 的请求落到模型端点并且当我只设置路径('admin' , admin.site.urls),对 /admin/ 的请求落到模型端点。我明白为什么会发生这种情况,Django 在将斜杠添加到末尾之前遍历所有端点,并使用附加的斜杠再次遍历它们。
  • @Charlestone 是的,我明白这一点。因此我建议你在你的正则表达式模式中添加一个斜杠。我在我的电脑上测试了一个类似的场景,它似乎为我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2019-04-27
  • 2017-09-28
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 2018-06-04
相关资源
最近更新 更多