Исключение Http404
Исключение Http404 применяется для генерации HTTP-ответа с кодом состояния 404 (Не найдено). Это исключение следует вызывать в тех случаях, когда запрашиваемый объект не найден в базе данных или когда условие для отображения страницы не выполнено. Django автоматически обрабатывает это исключение и отображает стандартную страницу 404.
Синтаксис
from django.http import Http404
raise Http404("Сообщение об ошибке")
Конструктор исключения принимает необязательный параметр - строку с сообщением об ошибке, которое будет отображено на странице 404.
Пример . С использованием get_object_or_404
Рассмотрим типичный пример использования исключения во вьюхе для получения статьи по ID:
from 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.
Пример . С проверкой условий
Использование исключения для проверки дополнительных условий, например, доступности статьи для публичного просмотра:
from 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})
Результат выполнения при обращении к неопубликованной статье:
"Page not found (404)"
"Request Method: GET"
"Request URL: http://example.com/article/5/"
"Article is not available"
Пример . Использование в API
Возврат ответа 404 при работе с JSON-API:
from 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:
{
"detail": "User not found"
}
Смотрите также
-
исключение
DoesNotExist,
которое выбрасывается при отсутствии объекта в базе данных -
исключение
ObjectDoesNotExist,
базовое исключение для всех случаев отсутствия объектов -
исключение
MultipleObjectsReturned,
которое возникает когда запрос возвращает более одного объекта -
исключение
PermissionDenied,
которое используется для генерации ответа с кодом 403