我如何使用“路径”或“re_path”捕获所有路由,以便 Django 将所有不匹配的请求传递到我的索引视图?

How can I use a catch all route using `path` or `re_path` so that Django passes all unmatched requests to my index view?

我的 url 模式是这样的:

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

    re_path('.*', IndexView.as_view()),
]

这有效,但它匹配 所有 URL,包括前缀为 adminapi 的 URL。我希望这些 URL 仍然匹配,并且要呈现任何不匹配的 URL IndexView.

在 2.0 之前,我使用这个正则表达式来达到这个目的。我尝试在 re_path 中使用它,但没有用,这就是我尝试上述方法的原因。

url(r'^(?P<path>.*)/$', HtmlView.as_view())

用例是我处理 404s 客户端的 SPA。

非常感谢。

解决这个问题的一个想法是让 django 捕获 404。

url.py

from django.conf.urls import handler404

handler404 = 'app_name.views.bad_request'

在你的 views.py

views.py

def bad_request(request):
    return redirect(reverse('home'))

你总是可以做一些正则表达式的事情来捕捉不匹配的 url。但是,嘿,这就完成了工作。 :)

所以正如我在问题描述中所说,在 re_path 中尝试我在 Django 2.0 之前使用的正则表达式不起作用。它基本上匹配所有请求 除了 / (即索引路径)。我通过使用该正则表达式和专门匹配 / 的第二个路径来修复此问题。这是代码:

urlpatterns = [
    re_path(r'^(?P<path>.*)/$', IndexView.as_view()),
    path('', IndexView.as_view()),
]

通过这些更改,我的其他路由将匹配,并且这两条路由将占所有其他 url。

您可以使用两个条目(一个用于“/”,另一个用于其他任何内容),但对它们都使用 path,这应该(稍微)更有效:

urlpatterns = [
    path('', IndexView.as_view(), {'resource': ''}),
    path('<path:resource>', IndexView.as_view())
]

在这种情况下,我使用 <path:resource> 因为 path 捕获所有资源名称,包括其中带有 / 的名称。但它不捕获主要索引资源 /。这就是为什么第一个条目。字典作为它的最后一个参数是因为如果我们想使用与第二个条目相同的视图,我们需要提供一个 resource 参数。

那个视图当然应该有 'resource' 作为参数:

def as_view(request, resource):
   ...