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

erg*_*sto 9 django django-urls

我的网址模式如下所示:

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

    re_path('.*', IndexView.as_view()),
]
Run Code Online (Sandbox Code Playgroud)

这有效,但它匹配所有URL,包括那些以admin和为前缀的 URL api。我希望这些 URL 仍然匹配,并希望任何不匹配的 URL 呈现IndexView.

在 2.0 之前,我为此使用了这个正则表达式。我尝试使用它,re_path但没有用,这就是导致我尝试上述方法的原因。

url(r'^(?P<path>.*)/$', HtmlView.as_view())
Run Code Online (Sandbox Code Playgroud)

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

提前谢谢了。

jgb*_*rah 10

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

urlpatterns = [
    path('', IndexView.as_view(), {'resource': ''}),
    path('<path:resource>', IndexView.as_view())
]
Run Code Online (Sandbox Code Playgroud)

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

当然,该视图应该以“资源”作为参数:

def as_view(request, resource):
   ...
Run Code Online (Sandbox Code Playgroud)


erg*_*sto 9

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

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

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


Oja*_*ale 5

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

网址.py

from django.conf.urls import handler404

handler404 = 'app_name.views.bad_request'
Run Code Online (Sandbox Code Playgroud)

并在您的 views.py 中

视图.py

def bad_request(request):
    return redirect(reverse('home'))
Run Code Online (Sandbox Code Playgroud)

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