如何使用`path`或`re_path`捕获所有路由,以便Django将所有不匹配的请求传递给索引视图?

时间:2018-06-28 14:02:43

标签: django django-urls

我的网址格式如下:

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())

用例是一个SPA,我在其中处理404s客户端。

非常感谢。

3 个答案:

答案 0 :(得分:2)

一个解决办法是让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。但这可以完成工作。 :)

答案 1 :(得分:1)

因此,正如我在问题描述中所说的那样,尝试在re_path中的Django 2.0之前尝试使用的正则表达式无效。基本上,所有请求 /(即索引路径)都将匹配。我通过使用该正则表达式和专门匹配/的第二条路径来解决此问题。这是代码:

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

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

答案 2 :(得分:0)

您可以使用两个条目(一个用于'/',另一个用于其他任何项),但是对两个都使用path,这应该(稍微)更有效:

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

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

该视图当然应该具有“资源”作为参数:

def as_view(request, resource):
   ...