Cat

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

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

Все статьи

Icon Link

Дополнительные материалы

Icon Link

Реклама

Icon Link
Сайт на Django proDream 25 Январь 2024 Просмотров: 800

Ошибки на сайте случаются постоянно, но далеко не все из них происходят по вине программиста. Самая знаменитая ошибка – 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.

Автор

    Нет комментариев

    Реклама