Django 5 для начинающих

Прогресс по курсу:  9/1004

11.9 Настройка своих шаблонов для страниц ошибок 403, 404
1 из 1 шага пройден

В этом разделе мы рассмотрим как настроить свой шаблон для страниц ошибок 403, 404, 500 в Django.

У хорошего сайта должно быть продумано все, даже дефолтные странички. Многие пользователи, видя ошибку 404 при переходе по ссылке, просто закрывают вкладку браузера, думая, что сайт работает некорректно.

Настройка представлений для ошибок

Первое, что нам необходимо сделать, это создать соответствующие представления для отлова ошибок и рендеринга своих шаблонов.

Добавим следующий код в файл views.py нашего приложения blog:

from django.shortcuts import render

def tr_handler404(request, exception):
    """
    Обработка ошибки 404
    """
    return render(request=request, template_name='errors/error_page.html', status=404, context={
        'title': 'Страница не найдена: 404',
        'error_message': 'К сожалению такая страница была не найдена, или перемещена', 
    })


def tr_handler500(request):
    """
    Обработка ошибки 500
    """
    return render(request=request, template_name='errors/error_page.html', status=500, context={
        'title': 'Ошибка сервера: 500',
        'error_message': 'Внутренняя ошибка сайта, вернитесь на главную страницу, отчет об ошибке мы направим администрации сайта',
    })


def tr_handler403(request, exception):
    """
    Обработка ошибки 403
    """
    return render(request=request, template_name='errors/error_page.html', status=403, context={
        'title': 'Ошибка доступа: 403',
        'error_message': 'Доступ к этой странице ограничен',
    })

Обработка в urls.py

Далее нам необходимо добавить обработку представлений в главном urls.py файле маршрутов:

from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from django.conf import settings
from apps.blog.feeds import LatestPostFeed


handler403 = 'apps.blog.views.tr_handler403' # New
handler404 = 'apps.blog.views.tr_handler404' # New
handler500 = 'apps.blog.views.tr_handler500' # New



urlpatterns = [
    path('ckeditor/', include('ckeditor_uploader.urls')),
    path('admin/', admin.site.urls),
    path('feeds/latest/', LatestPostFeed(), name='latest_post_feed'),
    path('', include('apps.blog.urls')),
    path('', include('apps.accounts.urls')),
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += [path('__debug__/', include('debug_toolbar.urls'))]

 

Создание шаблона для ошибок

В папке templates создадим папку errors, а в ней файл error_page.html со следующим содержимым:

{% extends 'main.html' %}

{% block content %}
    <div class="alert alert-danger alert-dismissible fade show" role="alert">
        {{ error_message }} | <a href="{% url 'home' %}"><strong>Вернуться на главную</strong></a>
        <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
    </div>
{% endblock content %}

 

Далее, чтобы увидеть работу наших страниц с ошибками, нам необходимо поставить режим DEBUG = False (т.е отключить) и добавить наш хост в список ALLOWED_HOSTS

DEBUG = False

ALLOWED_HOSTS = ['127.0.0.1']

Запустим сервер, и теперь при переходе на страницу с неправильным адресом мы получим ошибку 404, которую мы описали в шаблоне и представлении.

Аналогично будет работать с ошибками 403, 500. Только сообщение об ошибке будет то, что мы указали в представлении. Ссылка на документацию к разделу - https://docs.djangoproject.com/en/4.2/topics/http/views/#customizing-error-views.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

И еще вопрос: обработка ошибок вот так будет распространяться только на приложение блог или на весь проект?

@Ilia_Boiarintsev, на весь проект, просто в нашем случае представления будут использоваться из views.py приложения blog

Но строка apps.blog.views.tr_handler403 как раз и содержит путь apps/blog/views.py и имя функции для обработки ошибок, то есть можно представление разместить в любом приложении.

@Илья_Перминов, так и думал, просто уточнил для уверенности) Спасибо за ответ!

Я возвращаюсь сюда из будущего (с конца следующего курса). Вопрос: при ошибке 500 нужно задачу в  celery  например кинуть или просто сообщить на почту разработчику?

@Ilia_Boiarintsev, Вообще лучшей практикой будет логирование ошибок в журнал. А, например в Celery, можно кинуть уже задачу, которая будет раз в день/неделю отправлять эти логи с ошибками на почту.

@Илья_Перминов, Отлично! Спасибо