Django 简单页面捕获所有内容

Django flatpages catch all

提问人:bodger 提问时间:3/20/2020 更新时间:3/20/2020 访问量:95

问:

我在 Django 中对简单页面使用 catch all 模式,如下所示:-

urlpatterns = [
    path('somepath/', include('project.somepathapp.urls')),
    path('anotherpath/', include('project.anotherpathapp.urls')),
    etc.
]

urlpatterns += [
    path('<path:url>/', views.flatpage),
]

在我的模板中,我使用:-

<a href="/about-us/">About Us</a>

以访问“关于”简单页面。但是 URL 模式会去掉最后一个斜杠,并将 URL /about-us(而不是 /about-us/)传递给简单页面视图。然后,简单页面视图发现 URL 不以斜杠结尾,将其添加回去,找到页面并重定向到该 URL,但添加一个额外的斜杠,以便 URL 现在是 /about-us//

如果我从 catch all 模式中删除最后一个斜杠,则在使用APPEND_SLASH之前,主路径(somepath/ 和 anotherpath/)中任何没有最后一个斜杠的 URL 都会与 catch all 模式匹配,并且由于没有包含该 URL 的页面,因此用户将获得 404。因此,像 /somepath/ 这样的 URL 会起作用,但 /somepath 不会。

我做错了什么?对我来说,这似乎是第 22 条军规。我不能使用中间件选项,因为它并不总是通过其他中间件视图传递,所以我被卡住了。

有什么想法吗?

django django-flatpages

评论

0赞 Alasdair 3/20/2020
最近,在文档中为票证 31330 的示例中添加了尾部斜杠。如果这没有解决问题(或者它创造了另一个问题),那么可能值得在票证上添加评论。
0赞 Alasdair 3/20/2020
你也可以尝试 Django 1.11 文档中的 catch all 模式版本。如果您愿意,请更新。url()re_path()
1赞 bodger 3/20/2020
谢谢@Alasdair。我认为它创造了另一个。有趣的是,django.contrib.flatpages.urls 中的代码没有它,所以如果你从那里包含它,它就没有它。出于某种原因,我没有想到使用re_path。如果我使用 re_path('^(?P<url>.+/)$', views.flatpage) 所以,暂时,我会走这条路。非常感谢。
0赞 Alasdair 3/21/2020
很高兴奏效了。顺便说一句,我在 Django 错误跟踪器上看到了您的评论,我认为您在用户将被重定向到“/someurl”的末尾丢失了。//
1赞 bodger 3/21/2020
好地方 - 它在标记中 - 但由于某种原因它被解释为空白。我现在已经强迫它了 - 看起来不太好,但我不知道如何“正确”地做到这一点,它传达了信息。谢谢。

答: 暂无答案