HttpResponseNotFound

Класс HttpResponseNotFound предназначен для возврата HTTP-ответа с кодом состояния 404 (Not Found). Этот класс наследуется от HttpResponse и используется для явного указания того, что запрашиваемый ресурс не найден. Класс принимает те же параметры, что и родительский класс: содержимое ответа, заголовки и другие настройки. В отличие от стандартного HttpResponse, HttpResponseNotFound автоматически устанавливает код ответа 404.

Синтаксис

pythonHttpResponseNotFound(content='', content_type=None, status=404, charset=None, headers=None)

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

Создадим представление, которое возвращает ответ 404, если статья не найдена по идентификатору:

pythonfrom django.http import HttpResponseNotFound
from django.shortcuts import get_object_or_404
from myapp.models import Article

def article_detail(request, article_id):
  try:
    article = Article.objects.get(id=article_id)
    return HttpResponseNotFound(f'Article #{article_id} not found')
  except Article.DoesNotExist:
    return HttpResponseNotFound(f'Article #{article_id} not found')

Пример . С контентом в виде HTML

Используем HttpResponseNotFound для возврата HTML-страницы с сообщением об ошибке:

pythonfrom django.http import HttpResponseNotFound

def custom_404_view(request):
  html_content = """
    <h1>404 - Page Not Found</h1>
    <p>The requested page does not exist.</p>
  """
  return HttpResponseNotFound(html_content)

Пример . С установкой заголовков

Передадим дополнительные заголовки вместе с ответом 404:

pythonfrom django.http import HttpResponseNotFound

def api_404_view(request):
  headers = {
    'X-Content-Type-Options': 'nosniff',
    'Cache-Control': 'no-cache'
  }
  return HttpResponseNotFound(
    content='{"error": "Resource not found"}',
    content_type='application/json',
    headers=headers
  )

Пример . Использование в классовых представлениях

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

pythonfrom django.views import View
from django.http import HttpResponseNotFound
from myapp.models import Article

class ArticleDeleteView(View):
  def get(self, request, article_id):
    try:
      article = Article.objects.get(id=article_id)
      # Выполняем какое-либо действие с article
      return HttpResponseNotFound(f'Article #{article_id} not found')
    except Article.DoesNotExist:
      return HttpResponseNotFound(f'Article #{article_id} not found')

Пример . Комбинирование с функциями Django

Иногда бывает полезно комбинировать HttpResponseNotFound с другими методами, например, с render:

pythonfrom django.http import HttpResponseNotFound
from django.shortcuts import render
from myapp.models import Category

def category_detail(request, category_id):
  try:
    category = Category.objects.get(id=category_id)
    # Предположим, что здесь используется шаблон
    return render(request, 'category_detail.html', {'category': category})
  except Category.DoesNotExist:
    return HttpResponseNotFound(render(request, '404.html'))

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

  • класс HttpResponse,
    родительский класс для всех HTTP-ответов
  • класс JsonResponse,
    возвращает JSON-ответ с соответствующими заголовками
  • класс HttpResponseForbidden,
    возвращает ответ с кодом 403 Forbidden
  • класс HttpResponseRedirect,
    возвращает ответ с кодом 302 для перенаправления