Обработчик handler403
Обработчик handler403 используется для переопределения представления, которое вызывается при возникновении ошибки 403 (Forbidden). По умолчанию Django возвращает стандартную страницу с текстом "403 Forbidden". Однако вы можете задать собственный обработчик, который будет отображать кастомную страницу, логировать ошибки или выполнять дополнительные действия. Обработчик задаётся в файле urls.py на уровне проекта.
Обработчик принимает два параметра: объект request и объект exception, который содержит информацию об ошибке. Функция-обработчик должна возвращать объект HttpResponse. Чаще всего используется в связке с функцией render для рендеринга HTML-шаблона ошибки.
Синтаксис
handler403 = 'myapp.views.my_custom_403_view'
Настройка обработчика
Добавьте следующий код в корневой файл urls.py вашего проекта:
from 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:
from 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 для отображения ошибки:
<!DOCTYPE html>
<html>
<head>
<title>Доступ запрещён</title>
</head>
<body>
<h1>Ошибка 403</h1>
<p>{{ message }}</p>
<p>Детали: {{ exception }}</p>
<a href="/">Вернуться на главную</a>
</body>
</html>
Пример . С логированием
Можно добавить логирование ошибки в представлении:
import 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)
Пример . С разными шаблонами
Можно использовать разные шаблоны в зависимости от типа пользователя:
from 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)
Пример . С редиректом
Иногда удобно перенаправлять пользователя на другую страницу вместо показа страницы ошибки:
from 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,
которая используется для рендеринга шаблонов