HttpResponseNotModified
Класс HttpResponseNotModified наследуется от HttpResponse и предназначен для возврата ответа с кодом состояния 304. Он используется в механизмах кэширования, когда сервер проверяет наличие изменений в ресурсе. Если ресурс не изменился, сервер может вернуть этот ответ без тела, сообщая клиенту использовать закэшированную версию. Класс автоматически устанавливает статус-код 304 и удаляет любое содержимое, так как ответ с этим кодом не должен содержать тело.
Синтаксис
from django.http import HttpResponseNotModified
response = HttpResponseNotModified()
Параметры
Класс не принимает обязательных параметров, так как ответ 304 всегда должен быть пустым. Однако можно передать именованные аргументы для заголовков:
-
headers- словарь с дополнительными HTTP-заголовками -
status- код состояния (будет переопределен на 304) -
reason- текстовое описание статуса -
charset- кодировка (не используется для пустого тела)
Пример . С проверкой заголовков
Давайте создадим представление, которое проверяет наличие заголовка 'If-None-Match' с ETag и возвращает 304, если ресурс не изменился:
from 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, например, для управления кэшированием:
from 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:
from 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:
"<HttpResponseNotModified status_code=304>"
Смотрите также
-
класс
HttpResponse,
который используется для отправки HTTP-ответов с содержимым -
класс
JsonResponse,
который возвращает JSON-данные в HTTP-ответе -
класс
HttpResponseRedirect,
который отправляет клиенту редирект -
декоратор
condition,
который автоматически обрабатывает условные запросы