Ответ
В Django существует несколько уровней и подходов для обработки исключений, что позволяет гибко управлять поведением приложения при возникновении ошибок.
1. Middleware (глобальный уровень)
Это основной способ для создания единой логики обработки исключений для всего проекта. Middleware перехватывает исключения, возникшие в любом view, и может вернуть кастомный HTTP-ответ.
Для этого нужно создать класс middleware и реализовать в нем метод process_exception.
# myapp/middleware.py
from django.http import JsonResponse
from .exceptions import MyCustomException
class CustomExceptionMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
def process_exception(self, request, exception):
if isinstance(exception, MyCustomException):
return JsonResponse({'error': str(exception)}, status=400)
# Если это не наше исключение, Django продолжит стандартную обработку
return None
Затем его необходимо зарегистрировать в settings.py:
# settings.py
MIDDLEWARE = [
# ... другие middleware
'myapp.middleware.CustomExceptionMiddleware',
]
2. Обработка на уровне представления (локальный уровень)
Стандартный блок try...except в Python можно использовать внутри view для обработки конкретных ошибок, которые могут возникнуть в данном участке кода.
from django.http import HttpResponseBadRequest
from .models import Product
def product_detail(request, product_id):
try:
product = Product.objects.get(pk=product_id)
# ... логика представления
except Product.DoesNotExist:
return HttpResponseBadRequest("Товар не найден")
return render(request, 'product.html', {'product': product})
3. Пользовательские страницы ошибок (глобальные обработчики)
Django позволяет определить кастомные view для стандартных HTTP-ошибок. Это полезно для отображения брендированных страниц 404 или 500.
Для этого в корневом urls.py нужно определить переменные handler404, handler500 и т.д.
# myproject/urls.py
from django.urls import path
from myapp import views
urlpatterns = [
# ... ваши URL
]
handler404 = 'myapp.views.custom_page_not_found_view'
handler500 = 'myapp.views.custom_error_view'
Эти обработчики будут работать только когда DEBUG = False в settings.py.