Обработчик handler500
Обработчик handler500 определяет пользовательскую
функцию представления, которая вызывается при возникновении
необработанного исключения в процессе обработки запроса
(ошибка сервера). По умолчанию Django возвращает стандартную
HTML-страницу с кодом 500, но вы можете переопределить это
поведение, указав собственное представление в корневом
файле URLconf. Обработчик принимает объект запроса
HttpRequest и должен возвращать объект ответа
HttpResponse с кодом статуса 500.
Синтаксис
# В корневом файле urls.py
handler500 = 'myapp.views.custom_error_500'
Пример
Давайте создадим кастомное представление для ошибки 500:
# В файле 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:
# В файле 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:
<!DOCTYPE html>
<html>
<head>
<title>Ошибка сервера</title>
</head>
<body>
<h1>Ошибка {{ error_code }}</h1>
<p>{{ message }}</p>
<p>Пожалуйста, попробуйте позже</p>
</body>
</html>
Пример
Добавим логирование ошибки в представлении:
# В файле 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
)
Результат выполнения кода:
"ERROR: Error 500 occurred"
Пример
Используем обработчик для отправки уведомления администратору:
# В файле 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
)
Результат выполнения кода:
"Email sent to admins"
Смотрите также
-
обработчик
handler404,
который обрабатывает ошибку 404 Not Found -
обработчик
handler403,
который обрабатывает ошибку 403 Forbidden -
обработчик
handler400,
который обрабатывает ошибку 400 Bad Request -
класс
HttpResponseServerError,
который возвращает ответ с кодом статуса 500