В этом разделе мы рассмотрим как настроить свой шаблон для страниц ошибок 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.