Python Django: как изменить страницу ошибки 404?

Настройка страницы ошибки 404 “Страница не найдена”  —  одна из самых любопытных практик в разработке проекта на Django: сейчас же давайте узнаем, как обработать ошибку 404 с помощью собственной страницы!

404 Page Not Found считается самым известным кодом HTTP-статуса. На стадии коммерческого использования каждый хороший Django-проект должен обрабатывать эту ошибку с помощью собственноручно настроенной страницы, создающейся за несколько простых шагов, описанных в данной статье.

Не теряя времени, создадим Django-проект. Откройте консоль и напишите эти команды:

$ cd Desktop
$ mkdir mysite
$ cd mysite

Затем создайте Django-проект:

$ django-admin startproject mysite .

Запустите сервер со своим веб-приложением:

$ python manage.py runserver

В браузере перейдите по ссылке http://127.0.0.1:8000/ (локальный сервер, порт номер 8000): если вы увидите страницу с надписью “The install worked successfully! Congratulation!” (“Установка выполнена успешно! Поздравляем!”) и картинкой ракеты, то проект успешно создан и запущен.

Стандартная страница приветствия фреймворка Django

Давайте попробуем перейти на несуществующую страницу только что созданного нами сайта, например, на страницу http://127.0.0.1:8000/page

Страница Django Not Found по умолчанию

Сообщение внизу страницы гласит:

You’re seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.

Вы видите эту ошибку, потому что в вашем файле настроек Django установлено значение DEBUG = True. Измените это значение на False, и Django отобразит стандартную страницу 404.

Давайте сделаем то, что написано в отчёте об ошибке 404: отключим режим отладки Django, изменив значение константы DEBUGв файле настроек проекта settings.py, кроме этого, указываем адрес локального сервера в списке разрешенных адресов:

DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1']

Замечание! Когда вы будете располагать своё веб-приложение на хостинге для доступа к нему настоящих пользователей, вам понадобится снова изменить константу ALLOWED_HOSTS: указать приобретенный домен в качестве элемента списка.

Обновите страницу.

Страница Django Not Found 404 при значении константы DEBUG = False (при отключенном режиме разработчика)

Это и есть та самая страница, которую мы сейчас настроим с помощью собственного пользовательского шаблона.

Создаём файл представлений views.py в папке mysite с помощью данной команды:

$ touch mysite/views.py

Действительно, немного странно  —  создавать файл views.py в каталоге проекта. Во множестве руководств говорится, что views.py хранится в директориях каждого приложения в проекте, а не в директории самого проекта, но именно такой способ создания пользовательской страницы ошибки 404 “Страница не найдена” предлагается официальной документацией Django.

Ваш Django-проект теперь должен выглядеть примерно так:

.
├── db.sqlite3
├── manage.py
└── mysite
    ├── __init__.py
    ├── __pycache__
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    ├── views.py
    └── wsgi.py

Теперь пришло время добавить функцию-представление, которая будет обрабатывать ошибку 404. В файл mysite/views.py добавьте следующие строчки кода:

from django.shortcuts import render

def page_not_found_view(request, exception):
    return render(request, '404.html', status=404)

Также необходимо в файлеurls.py директории Django-проекта mysite определить значение переменной handler404:

handler404 = "mysite.views.page_not_found_view"

В итоге файл mysite/urls.py должен выглядеть следующим образом:

from django.contrib import admin
from django.urls import path

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

handler404 = "django_404_project.views.page_not_found_view"

Теперь пришло время поработать с шаблоном страницы ошибки 404 “Страница не найдена”. Для этого нужно создать папку templates в директории проекта mysite, а затем добавить в эту папку файл 404.html.

$ mkdir templates
$ touch templates/404.html

Теперь необходимо указать Django, где именно находится ваша папка templates, поэтому в файле settings.py, в константе TEMPLATES следует обозначить значение ключа ‘DIRS’ следующим образом:

import os

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        ...
    },
]

Теперь, в файле шаблона 404.html, можно начинать настраивать внешний вид страницы сообщения об ошибке по своему усмотрению. Для примера сделаем её крайне простой:

<h1>404 Page Not Found</h1>
<p>Моя пользовательская страница ошибки 404!</p>

Перед тем, как переключиться на вкладку браузера для проверки только что созданного шаблона  —  убедитесь, что структура вашего проекта выглядит вот так:

.
├── db.sqlite3
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── __pycache__
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
└── templates
    └── 404.html

После проверки структуры проекта — перейдите по любому из несуществующих путей вашего сайта: пользовательский HTML-шаблон 404.html обработает их все!

Пользовательская страница ошибки “404 Page Not Found”

Поздравляем  —  всё готово! Ваша собственноручно созданная страница 404 Page Not Found теперь используется каждый раз, когда пользователь обращается к несуществующему ресурсу.

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Görkem Arslan: Django: Customize 404 Error Page

Предыдущая статьяКак с легкостью создавать формы на React с помощью react-hook-form
Следующая статьяАвтоматизация: друг или враг дизайнера?