Ошибка Django 500 для несуществующего URL в Debug = False - PullRequest
0 голосов
/ 06 января 2019

Я использую Django 2.1.3 в Python 3.6.7. Предположим, что у меня есть этот путь URL:

path('admin/', admin.site.urls)

Если я перейду к /ad, пока DEBUG = True, я вижу обычную страницу ошибки Django 404:

enter image description here

Но если я сделаю DEBUG = False, то сервер покажет мне 500.htm вместо 404.html для неверного URL /ad (что не соответствует ни одному из Шаблоны URL).

Появляется 404.html для действительного URL, который вызывает ошибку 404. (например, когда запрос несуществующего объекта происходит с функцией get_object_or_404)

вот моя /templates структура каталогов:

/templates
    400.html
    403.html
    404.html
    500.html
    index.html
    ...

Итак, как я должен сказать Django, чтобы он отображал ошибку 404 в производственной среде (в дополнение к разработке), если URL-адрес запроса не соответствует ни одному из шаблонов URL-адресов?

Примечание:

  • Согласно docs , если у меня есть 404.html в корневом каталоге шаблонов, этот 404.html будет использоваться с обработчиком ошибок по умолчанию.

Обновление:

Я понял, что он взломан, потому что defaults.page_not_found поднимает Resolver404, и это вызвано:

путь, пройденный для разрешения (), не отображается в представлении

что и произошло, (/ad не соответствует ни одному виду)

вот мой urls.py:

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path

urlpatterns = [
              path('admin/', admin.site.urls),
              ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Я выяснил, что один из моих пользовательских процессоров контекста шаблона использует django.urls.resolve и, поскольку путь не соответствует ни одному представлению, resolve поднимает Resolver404 .

Итак, я исправляю этот контекстный процессор и проблема решена!

0 голосов
/ 06 января 2019

Вам нужно создать 404 представление, которое будет отображаться при отсутствии совпадения URL. Затем вам нужно установить hander404 в urls.py

handler404 = 'mysite.views.my_custom_page_not_found_view'

Для получения дополнительной информации: https://docs.djangoproject.com/en/dev/topics/http/views/#customizing-error-views

...