Как я могу использовать перехват всех маршрутов, используя `path` или` re_path`, чтобы Django передавал все несопоставленные запросы моему представлению индекса? - PullRequest
0 голосов
/ 28 июня 2018

Мои шаблоны URL выглядят так:

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

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

Это работает, но соответствует всем URL-адресам, включая префиксы с admin и api. Я хочу, чтобы эти URL-адреса по-прежнему совпадали, а для любых непревзойденных URL-адресов отображалось IndexView.

До версии 2.0 я использовал это регулярное выражение для этой цели. Я попытался использовать его в re_path, но это не сработало, что и привело меня к попыткам описанного выше.

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

Вариант использования - это SPA, где я работаю с клиентом 404.

Большое спасибо заранее.

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Итак, как я сказал в описании вопроса, попытка регулярного выражения, которое я использовал до Django 2.0 в re_path, не работала. Он в основном будет соответствовать всем запросам , кроме / (то есть, путь индекса). Я исправил это, используя и это регулярное выражение, и второй путь, соответствующий /. Вот код:

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

С этими изменениями мои другие маршруты будут совпадать, и эти два маршрута будут учитывать все остальные URL.

0 голосов
/ 01 мая 2019

Вы можете использовать две записи (одну для '/', другую для чего-либо еще), но используя path для них обоих, что должно быть (немного) более эффективным:

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

В этом случае я использую <path:resource>, потому что path перехватывает все имена ресурсов, в том числе с / в них. Но он не захватывает основной индексный ресурс, /. Вот почему первая запись. Словарь является последним аргументом для этого, потому что нам нужно предоставить параметр resource, если мы хотим использовать то же представление, что и во второй записи.

Это представление, конечно, должно иметь 'ресурс' в качестве параметра:

def as_view(request, resource):
   ...
0 голосов
/ 28 июня 2018

Одна из идей - позволить Джанго поймать 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. но эй, это делает работу. :)

...