我的网址格式如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
re_path('.*', IndexView.as_view()),
]
这有效,但它匹配所有 URL,包括以admin
和api
开头的URL。我希望这些URL仍然匹配,并让所有不匹配的URL呈现IndexView
。
在2.0之前,我将此正则表达式用于此目的。我尝试在re_path
中使用它,但是没有用,这就是导致我尝试上述操作的原因。
url(r'^(?P<path>.*)/$', HtmlView.as_view())
用例是一个SPA,我在其中处理404s客户端。
非常感谢。
答案 0 :(得分:2)
一个解决办法是让django捕获404。
from django.conf.urls import handler404
handler404 = 'app_name.views.bad_request'
和您的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):
...