РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
284 of 818 menu

Обработчик 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,
    которая используется для рендеринга шаблонов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить