HttpResponseNotModified

Класс HttpResponseNotModified наследуется от HttpResponse и предназначен для возврата ответа с кодом состояния 304. Он используется в механизмах кэширования, когда сервер проверяет наличие изменений в ресурсе. Если ресурс не изменился, сервер может вернуть этот ответ без тела, сообщая клиенту использовать закэшированную версию. Класс автоматически устанавливает статус-код 304 и удаляет любое содержимое, так как ответ с этим кодом не должен содержать тело.

Синтаксис

pythonfrom django.http import HttpResponseNotModified

response = HttpResponseNotModified()

Параметры

Класс не принимает обязательных параметров, так как ответ 304 всегда должен быть пустым. Однако можно передать именованные аргументы для заголовков:

Пример . С проверкой заголовков

Давайте создадим представление, которое проверяет наличие заголовка 'If-None-Match' с ETag и возвращает 304, если ресурс не изменился:

pythonfrom django.http import HttpResponseNotModified, HttpResponse
from django.views.decorators.http import require_GET

@require_GET
def article_view(request, article_id):
  article = Article.objects.get(id=article_id)
  current_etag = f"etag-{article.updated_at.timestamp()}"
  if request.headers.get('If-None-Match') == current_etag:
    return HttpResponseNotModified()
  response = HttpResponse(f"<h1>{article.title}</h1>")
  response['ETag'] = current_etag
  return response

Пример . С дополнительными заголовками

В некоторых случаях может потребоваться добавить заголовки к ответу 304, например, для управления кэшированием:

pythonfrom django.http import HttpResponseNotModified

def check_resource(request):
  if request.headers.get('If-Modified-Since') == 'Wed, 21 Oct 2026 07:28:00 GMT':
    response = HttpResponseNotModified()
    response['Cache-Control'] = 'max-age=3600'
    response['Vary'] = 'User-Agent'
    return response
  return HttpResponse("Resource content")

Пример . В контексте класса-представления

Рассмотрим использование HttpResponseNotModified внутри метода класса DetailView:

pythonfrom django.views.generic import DetailView
from django.http import HttpResponseNotModified
from myapp.models import Article

class ArticleDetailView(DetailView):
  model = Article
  template_name = 'article.html'
  context_object_name = 'article'
  
  def get(self, request, *args, **kwargs):
    self.object = self.get_object()
    article_etag = f"etag-{self.object.updated_at.timestamp()}"
    if request.headers.get('If-None-Match') == article_etag:
      return HttpResponseNotModified()
    response = super().get(request, *args, **kwargs)
    response['ETag'] = article_etag
    return response

Результат при повторном запросе с тем же ETag:

python"<HttpResponseNotModified status_code=304>"

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

  • класс HttpResponse,
    который используется для отправки HTTP-ответов с содержимым
  • класс JsonResponse,
    который возвращает JSON-данные в HTTP-ответе
  • класс HttpResponseRedirect,
    который отправляет клиенту редирект
  • декоратор condition,
    который автоматически обрабатывает условные запросы