Создание сайта на Django: урок 54, свои страницы ошибок 403, 404, 500
avatar
7 | (offline)
❤️‍🔥Notehunter Developer
Добавлено:
Категория: Руководства «Django»
Комментариев: 0

Создание своих страниц ошибок 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:

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

Комментарии к статье 0
Комментариев нет
Форма добавления комментария (необходима регистрация)