Создание своих страниц ошибок 403, 404, 500
Примечание: если кто не читал предыдущие уроки, то можете создать в любом подключенном приложении во views.py, то, что я буду создавать ниже.
Так как я иду шаг за шагом в рамках своих уроков, буду делать так, чтобы вся картина была - как собранный пазл воедино. Поэтому в модуле system, в папке views, я создам файл system.py.

Со следующим содержимым
modules/system/views/system.py
from django.shortcuts import render
def tr_handler404(request, exception):
"""
Обработка ошибки 404
"""
return render(request=request, template_name='modules/system/errors/error_page.html', status=404, context={
'title': 'Страница не найдена: 404',
'error_message': 'К сожалению такая страница была не найдена, или перемещена'
})
def tr_handler500(request):
"""
Обработка ошибки 500
"""
return render(request=request, template_name='modules/system/errors/error_page.html', status=500, context={
'title': 'Ошибка сервера: 500',
'error_message': 'Внутренняя ошибка сайта, вернитесь на главную страницу, отчет об ошибке мы направим администрации сайта'
})
def tr_handler403(request, exception):
"""
Обработка ошибки 403
"""
return render(request=request, template_name='modules/system/errors/error_page.html', status=403, context={
'title': 'Ошибка доступа: 403',
'error_message': 'Доступ к этой странице ограничен'
})
Пояснение:
- С помощью представление на основе функций мы создаем рендеринг страницы с определенным контекстом, присваивая код ошибки.
- Контекст мы будем передавать в шаблон.
title
- в заголовок страницы.error_message
- в сообщение об ошибке.
Также не забываем, если вы используете декомпозицию и храните все по отдельности, то изменим наш __init__.py файл:
modules/system/views/__init__.py
from modules.system.views.profiles import *
from modules.system.views.authenticated import *
from modules.system.views.feedback import *
from modules.system.views.system import *
__all__ = '__all__'
Далее я создам следующий шаблон:
templates/modules/system/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 %}
Пояснение:
- Я взял за основу стиль оповещения из Bootstrap.
- Внутри оповещения будет сообщение об ошибки из контекста и ссылка на главную страницу.
А теперь подключим представления на основе функций в основной файл urls.py
backend/urls.py
from django.contrib import admin
from django.urls import path, include
from django.contrib.sitemaps.views import sitemap
from django.conf.urls.static import static
from backend import settings
from modules.blog.feeds import LatestArticlesFeed
from modules.blog.sitemaps import ArticleSitemap
handler403 = 'modules.system.views.tr_handler403'
handler404 = 'modules.system.views.tr_handler404'
handler500 = 'modules.system.views.tr_handler500'
sitemaps = {
'articles': ArticleSitemap,
}
urlpatterns = [
path('ckeditor5/', include('django_ckeditor_5.urls')),
path('admin/', admin.site.urls),
path('s/', include('modules.system.urls')),
path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
path('feed/', LatestArticlesFeed()),
path('', include('modules.blog.urls')),
]
if settings.DEBUG:
urlpatterns = [path('__debug__/', include('debug_toolbar.urls'))] + urlpatterns
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Пояснение:
- В файл urls.py я добавил следующее:
handler403 = 'modules.system.views.tr_handler403'
handler404 = 'modules.system.views.tr_handler404'
handler500 = 'modules.system.views.tr_handler500'
И при переходе без дебаг режима (Debug = False) по неправильному адресу, получаем ошибку 404:

Отлично. Все работает. На этом урок завершен.