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)
因此,正如我在问题描述中所说,在 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。
解决这个问题的一个想法是让 django 捕获 404。
from django.conf.urls import handler404
handler404 = 'app_name.views.bad_request'
Run Code Online (Sandbox Code Playgroud)
并在您的 views.py 中
def bad_request(request):
return redirect(reverse('home'))
Run Code Online (Sandbox Code Playgroud)
你总是可以做一些正则表达式来捕捉不匹配的 url。但是,嘿,这可以完成工作。:)
| 归档时间: |
|
| 查看次数: |
8212 次 |
| 最近记录: |