Короткий ответ
Django возвращает ответ 404 Not Found, используя представление page_not_found, и показывает подробную debug-страницу, если DEBUG=True, либо шаблон 404.html, если DEBUG=False.
Как это работает подробнее
Диспетчер URL проходит по всем urlpatterns (включая вложенные через include()); если ни один шаблон не совпал, возникает исключение Resolver404, которое Django перехватывает на уровне обработки запроса и формирует HTTP-ответ со статусом 404.
Пример кода
example.py
# urls.py (корневой)
handler404 = "myapp.views.custom_404"
# myapp/views.py
from django.http import HttpResponseNotFound
def custom_404(request, exception):
return HttpResponseNotFound("Страница не найдена")
# Проверка: с DEBUG=False запрос на несуществующий путь
# должен вернуть текст "Страница не найдена" и статус 404.Что использовать на практике
- Практика. В режиме разработки (
DEBUG=True) Django показывает список всех проверенных URL-паттернов, что удобно для отладки опечаток в маршрутах. В production нужен собственный шаблонtemplates/404.html, иначе пользователь увидит стандартную минималистичную страницу.
Подводные камни
- Риск. Путают поведение 404 с
DEBUG=True(подробная диагностика) иDEBUG=False(production-страница) и тестируют «как в проде» с включённым DEBUG; забывают зарегистрировать кастомный обработчикhandler404в корневомurls.py.