Перейти к контенту

Django 40. Собственные страницы ошибок

Сайт на Django Иван Ашихмин 1236

В этом посте мы добавим собственные страницы ошибок на сайт.

Django 40. Собственные страницы ошибок
Сайт на Django Иван Ашихмин 1236

Ошибки на сайте случаются постоянно, но далеко не все из них происходят по вине программиста. Самая знаменитая ошибка – 404 Not Found – относится к пользовательским ошибкам, когда был совершён переход на несуществующую страницу. Ещё одна известная ошибка – 500 Internal Server Error – относится к ошибкам на стороне сервера. Это означает, что сервер не справился с какой-то задачей.

Всё это называется "Кодом состояния HTTP" или по простому "HTTP статус кодом".
Всего их пять видов:

  1. 1xx - информационные.
  2. 2xx - успешные.
  3. 3xx - перенаправления.
  4. 4xx - ошибки клиента.
  5. 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.

Аватар автора

Автор

Иван Ашихмин

Программист, фрилансер и автор гайдов. Занимаюсь разработкой ботов, сайтов и не только.

Войдите, чтобы оставить комментарий.

Комментариев пока нет.