Исключение Http404

Исключение Http404 применяется для генерации HTTP-ответа с кодом состояния 404 (Не найдено). Это исключение следует вызывать в тех случаях, когда запрашиваемый объект не найден в базе данных или когда условие для отображения страницы не выполнено. Django автоматически обрабатывает это исключение и отображает стандартную страницу 404.

Синтаксис

pythonfrom django.http import Http404

raise Http404("Сообщение об ошибке")

Конструктор исключения принимает необязательный параметр - строку с сообщением об ошибке, которое будет отображено на странице 404.

Пример . С использованием get_object_or_404

Рассмотрим типичный пример использования исключения во вьюхе для получения статьи по ID:

pythonfrom django.http import Http404
from django.shortcuts import render
from myapp.models import Article

def article_detail(request, article_id):
  try:
    article = Article.objects.get(id=article_id)
  except Article.DoesNotExist:
    raise Http404("Article does not exist")
  
  return render(request, 'article_detail.html', {'article': article})

Если статья с указанным ID не найдена, будет вызвано исключение Http404.

Пример . С проверкой условий

Использование исключения для проверки дополнительных условий, например, доступности статьи для публичного просмотра:

pythonfrom django.http import Http404
from django.shortcuts import render
from myapp.models import Article

def article_view(request, article_id):
  try:
    article = Article.objects.get(id=article_id)
  except Article.DoesNotExist:
    raise Http404("Article not found")
  
  if not article.is_published:
    raise Http404("Article is not available")
  
  return render(request, 'article_view.html', {'article': article})

Результат выполнения при обращении к неопубликованной статье:

python"Page not found (404)"
"Request Method: GET"
"Request URL: http://example.com/article/5/"
"Article is not available"

Пример . Использование в API

Возврат ответа 404 при работе с JSON-API:

pythonfrom django.http import JsonResponse, Http404
from myapp.models import User

def user_api(request, user_id):
  try:
    user = User.objects.get(id=user_id)
  except User.DoesNotExist:
    raise Http404("User not found")
  
  return JsonResponse({
    'id': user.id,
    'username': user.username,
    'email': user.email
  })

При запросе несуществующего пользователя будет возвращен ответ с кодом 404:

python{
  "detail": "User not found"
}

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

  • исключение DoesNotExist,
    которое выбрасывается при отсутствии объекта в базе данных
  • исключение ObjectDoesNotExist,
    базовое исключение для всех случаев отсутствия объектов
  • исключение MultipleObjectsReturned,
    которое возникает когда запрос возвращает более одного объекта
  • исключение PermissionDenied,
    которое используется для генерации ответа с кодом 403