Django 40. Собственные страницы ошибок
В этом посте мы добавим собственные страницы ошибок на сайт.
Дополнительные материалы
Для скачивания материалов необходимо войти или зарегистрироваться
Файлы также можно получить в Telegram-боте по коду: 102630
Реклама
Ошибки на сайте случаются постоянно, но далеко не все из них происходят по вине программиста. Самая знаменитая ошибка – 404 Not Found
– относится к пользовательским ошибкам, когда был совершён переход на несуществующую страницу. Ещё одна известная ошибка – 500 Internal Server Error
– относится к ошибкам на стороне сервера. Это означает, что сервер не справился с какой-то задачей.
Всё это называется "Кодом состояния HTTP" или по простому "HTTP статус кодом".
Всего их пять видов:
- 1xx - информационные.
- 2xx - успешные.
- 3xx - перенаправления.
- 4xx - ошибки клиента.
- 5xx - ошибки сервера.
Полный список кодов с описанием доступен в википедии: https://ru.wikipedia.org/wiki/Список_кодов_состояния_HTTP
Нас интересуют 4xx и 5xx статус коды, проще говоря – ошибки.
Мы с вами сделаем страницы отображающиеся при следующих ошибках:
400 Bad Request
– когда был отправлен неправильный запрос или данные.403 Forbidden
– когда пользователь пытается получить доступ к страницам сайта, на просмотр которых у него нет разрешения.404 Not Found
– когда пользователь переходит на несуществующую страницу.500 Internal Server Error
– когда на стороне сервера что-то пошло не так и поднялась необработанная ошибка.
Утилитарное приложение utils_app.
Для обработки ошибок нам необходимо написать обработчики. Дабы не писать их в основных приложениях, создадим новое utils_app
.
Для этого выполним команду: python manage.py startapp utils_app
.
Не забудьте сразу добавить новое приложение в INSTALLED_APPS
Обработчики ошибок.
Нам необходимо написать четыре простейшие функции, которые будут вызываться при возникновении определённой ошибки.
В директории приложения создадим файл exception_handlers.py
.
Создадим четыре функции:
bad_request_handler
- для обработки 400-й ошибки.permission_denied_handler
- для обработки 403-й ошибки.page_not_found_handler
- для обработки 404-й ошибки.server_error_handler
- для обработки 500-й ошибки.
Каждая функция принимает два аргумента request
и exception
. Обратите внимание, что аргумент exception
не всегда передаётся в обработчик, по этому устанавливаем ему значение по умолчанию None
.
В каждой функции возвращаем работу функции render
, передавая в аргументах request
, путь до файла шаблона и статус-код ошибки.
Код функций:
from django.shortcuts import render
from rest_framework import status
def bad_request_handler(request, exception=None):
return render(request, "utils_app/400.html", status=status.HTTP_400_BAD_REQUEST)
def permission_denied_handler(request, exception=None):
return render(request, "utils_app/403.html", status=status.HTTP_403_FORBIDDEN)
def page_not_found_handler(request, exception=None):
return render(request, "utils_app/404.html", status=status.HTTP_404_NOT_FOUND)
def server_error_handler(request, exception=None):
return render(request, "utils_app/500.html", status=status.HTTP_500_INTERNAL_SERVER_ERROR)
Шаблон страницы с ошибкой.
Нам нужно четыре шаблона. Создадим в директории с шаблонами новую директорию для приложения utils_app
и в ней файлы шаблонов.
У меня четыре шаблона. Все четыре одинаковые, за исключением текста, поэтому покажу пример только одного шаблона:
{% extends "blog/base.html" %}
{% block title %}404 - страница не найдена!{% endblock %}
{% block content %}
<div class="d-flex align-items-center justify-content-center vh-100">
<div class="text-center">
<h1 class="display-1 fw-bold">404</h1>
<p class="fs-3"><span class="text-danger">Ой!</span> Страница не найдена.</p>
<p class="lead">
Запрашиваемая вами страница не найдена.
</p>
<a href="{% url 'blog:index' %}" class="btn btn-primary my-btn">Вернуться на главную</a>
</div>
</div>
{% endblock %}
Выводим текст соответствующий статус-коду.
Подключение обработчиков.
Осталось подключить обработчики. Для этого откроем главный файл urls.py
, расположенный в директории проекта рядом с файлом settings.py
.
В нём в конце файла добавляем четыре переменные. Значением переменных будет строка вида "название_приложения.файл_с_обработчиками.название_функции_обработчика"
.
handler400 = "utils_app.exception_handlers.bad_request_handler"
handler403 = "utils_app.exception_handlers.permission_denied_handler"
handler404 = "utils_app.exception_handlers.page_not_found_handler"
handler500 = "utils_app.exception_handlers.server_error_handler"
Обратите внимание! Чтобы собственные страницы ошибок заработали, параметр DEBUG в файле settings.py должен быть установлен в False!
Заключение.
Вот таким вот простым и нехитрым способом можно сделать собственные страницы ошибок в Django.
Все статьи