Обработчик handler403

Обработчик handler403 используется для переопределения представления, которое вызывается при возникновении ошибки 403 (Forbidden). По умолчанию Django возвращает стандартную страницу с текстом "403 Forbidden". Однако вы можете задать собственный обработчик, который будет отображать кастомную страницу, логировать ошибки или выполнять дополнительные действия. Обработчик задаётся в файле urls.py на уровне проекта.

Обработчик принимает два параметра: объект request и объект exception, который содержит информацию об ошибке. Функция-обработчик должна возвращать объект HttpResponse. Чаще всего используется в связке с функцией render для рендеринга HTML-шаблона ошибки.

Синтаксис

pythonhandler403 = 'myapp.views.my_custom_403_view'

Настройка обработчика

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

pythonfrom django.urls import path
from myapp import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index, name='index'),
]

# Переопределяем обработчик 403
handler403 = 'myapp.views.custom_403_view'

Пример . Представление

Теперь создадим само представление в файле views.py:

pythonfrom django.shortcuts import render
from django.http import HttpResponse

def custom_403_view(request, exception):
    """
    Кастомное представление для ошибки 403.
    """
    context = {
        'message': 'У вас недостаточно прав для просмотра этой страницы.',
        'exception': exception,
    }
    return render(request, 'errors/403.html', context, status=403)

Пример . Шаблон

Создадим шаблон errors/403.html для отображения ошибки:

html<!DOCTYPE html>
<html>
<head>
    <title>Доступ запрещён</title>
</head>
<body>
    <h1>Ошибка 403</h1>
    <p>{{ message }}</p>
    <p>Детали: {{ exception }}</p>
    <a href="/">Вернуться на главную</a>
</body>
</html>

Пример . С логированием

Можно добавить логирование ошибки в представлении:

pythonimport logging
from django.shortcuts import render

logger = logging.getLogger(__name__)

def custom_403_view(request, exception):
    # Логируем информацию об ошибке
    logger.warning(
        f"403 Forbidden: {request.path} - {exception}"
    )

    context = {
        'error_code': 403,
        'error_message': 'Доступ запрещён.',
    }
    return render(request, 'errors/403.html', context, status=403)

Пример . С разными шаблонами

Можно использовать разные шаблоны в зависимости от типа пользователя:

pythonfrom django.shortcuts import render
from django.http import HttpResponse

def custom_403_view(request, exception):
    if request.user.is_authenticated:
        template_name = 'errors/403_authenticated.html'
        context = {
            'user': request.user,
            'message': 'У вас нет прав для выполнения этого действия.',
        }
    else:
        template_name = 'errors/403_anonymous.html'
        context = {
            'message': 'Пожалуйста, авторизуйтесь для доступа к этой странице.',
        }

    return render(request, template_name, context, status=403)

Пример . С редиректом

Иногда удобно перенаправлять пользователя на другую страницу вместо показа страницы ошибки:

pythonfrom django.shortcuts import redirect
from django.urls import reverse

def custom_403_view(request, exception):
    # Перенаправляем авторизованных пользователей на главную
    if request.user.is_authenticated:
        return redirect('index')

    # Для неавторизованных показываем страницу входа
    return redirect(reverse('login') + '?next=' + request.path)

Смотрите также

  • обработчик handler404,
    который вызывается при ошибке 404 Not Found
  • обработчик handler500,
    который вызывается при ошибке 500 Internal Server Error
  • обработчик handler400,
    который вызывается при ошибке 400 Bad Request
  • функция render,
    которая используется для рендеринга шаблонов