我收到此警告,我想摆脱它... 我的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先遍历所有端点,然后再在末尾添加斜杠,然后再附加斜杠再遍历端点。
因此,我必须同时指定admin
和admin/
路径,以使对/admin
和/admin/
的请求均落入管理站点,这导致警告出现...可能不应该发生...
我能以某种方式解决这个问题吗? (无需更改我想要的网址路径...)
p.s。我将APPEND_SLASH
设置为True
编辑:
当我只使用
urlpatterns = [
path('admin/', admin.site.urls),
]
对/admin
和/admin/
的请求均正确属于管理页面。
答案 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]+)/$', ...),