HttpResponseNotFound
Класс HttpResponseNotFound предназначен для возврата HTTP-ответа с кодом состояния 404 (Not Found). Этот класс наследуется от HttpResponse и используется для явного указания того, что запрашиваемый ресурс не найден. Класс принимает те же параметры, что и родительский класс: содержимое ответа, заголовки и другие настройки. В отличие от стандартного HttpResponse, HttpResponseNotFound автоматически устанавливает код ответа 404.
Синтаксис
HttpResponseNotFound(content='', content_type=None, status=404, charset=None, headers=None)
Пример . Использование в представлении
Создадим представление, которое возвращает ответ 404, если статья не найдена по идентификатору:
from 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-страницы с сообщением об ошибке:
from 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:
from 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 внутри классового представления:
from 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:
from 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 для перенаправления