Обработчик handler500

Обработчик handler500 определяет пользовательскую функцию представления, которая вызывается при возникновении необработанного исключения в процессе обработки запроса (ошибка сервера). По умолчанию Django возвращает стандартную HTML-страницу с кодом 500, но вы можете переопределить это поведение, указав собственное представление в корневом файле URLconf. Обработчик принимает объект запроса HttpRequest и должен возвращать объект ответа HttpResponse с кодом статуса 500.

Синтаксис

python# В корневом файле urls.py
handler500 = 'myapp.views.custom_error_500'

Пример

Давайте создадим кастомное представление для ошибки 500:

python# В файле views.py
from django.http import HttpResponse
from django.template import loader

def custom_error_500(request):
  context = {
    'error_code': 500,
    'message': 'Internal Server Error'
  }
  template = loader.get_template('500.html')
  return HttpResponse(
    template.render(context, request),
    status=500
  )

Пример

Подключим обработчик в корневом файле URLconf:

python# В файле myproject/urls.py
from django.contrib import admin
from django.urls import path, include

handler500 = 'myapp.views.custom_error_500'

urlpatterns = [
  path('admin/', admin.site.urls),
  path('', include('myapp.urls')),
]

Пример

Создадим шаблон для отображения ошибки 500:

templates/500.html<!DOCTYPE html>
<html>
<head>
  <title>Ошибка сервера</title>
</head>
<body>
  <h1>Ошибка {{ error_code }}</h1>
  <p>{{ message }}</p>
  <p>Пожалуйста, попробуйте позже</p>
</body>
</html>

Пример

Добавим логирование ошибки в представлении:

python# В файле views.py
import logging
from django.http import HttpResponse
from django.template import loader

logger = logging.getLogger(__name__)

def custom_error_500(request):
  logger.error(
    'Error 500 occurred',
    extra={
      'path': request.path,
      'method': request.method
    }
  )

  context = {
    'error_code': 500,
    'message': 'Internal Server Error'
  }
  template = loader.get_template('500.html')
  return HttpResponse(
    template.render(context, request),
    status=500
  )

Результат выполнения кода:

python"ERROR: Error 500 occurred"

Пример

Используем обработчик для отправки уведомления администратору:

python# В файле views.py
from django.core.mail import mail_admins
from django.http import HttpResponse
from django.template import loader

def custom_error_500(request):
  mail_admins(
    subject='Error 500',
    message=f'Error on page: {request.path}',
    fail_silently=True
  )

  template = loader.get_template('500.html')
  context = {'error_code': 500}
  return HttpResponse(
    template.render(context, request),
    status=500
  )

Результат выполнения кода:

python"Email sent to admins"

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

  • обработчик handler404,
    который обрабатывает ошибку 404 Not Found
  • обработчик handler403,
    который обрабатывает ошибку 403 Forbidden
  • обработчик handler400,
    который обрабатывает ошибку 400 Bad Request
  • класс HttpResponseServerError,
    который возвращает ответ с кодом статуса 500