Если вы разработчик Django, вы, вероятно, знакомы с django.core.cache (кэш на стороне сервера). Однако Django предлагает еще один мощный набор инструментов для эффективного управления HTTP-кэшированием – django.utils.cache. Этот модуль сосредоточен на управлении HTTP-заголовками, которые необходимы для снижения нагрузки на сервер и улучшения пользовательского опыта.

В этом посте мы рассмотрим основные функции и метод использования django.utils.cache.


django.core.cache против django.utils.cache



Самое первое, что нужно прояснить.

  • django.core.cache (кэш на стороне сервера):

    • Сохраняет результаты запросов к базе данных, результаты сложных вычислений, части шаблонов и т.д. в памяти сервера (RAM), Redis, Memcached и т.д.
    • Цель: Снизить нагрузку на серверные вычисления и повысить скорость генерации ответа.
  • django.utils.cache (HTTP-кэш / клиентский кэш):

    • Устанавливает HTTP-заголовки ответа, такие как Cache-Control, Vary, ETag, Last-Modified.
    • Цель: Указать браузеру или прокси-серверу кэшировать ответ, чтобы, когда тот же запрос возникает снова, использовать кэшированный ответ без повторного запроса к серверу.

Проще говоря, core.cache кэширует данные, тогда как utils.cache управляет кэшированием HTTP-ответов.


Основные декораторы и функции

Модуль django.utils.cache в основном используется в виде декораторов, применяемых к представлениям (View).

1. @cache_control

Это самый базовый и мощный декоратор. Он позволяет тонко контролировать Cache-Control HTTP-заголовок.

  • max_age: Время действия кэша (в секундах). Браузер использует кэшированную версию в течение этого времени.
  • public=True: Указывает, что ответ может быть сохранен в публичном кэше (например, CDN, прокси).
  • private=True: Указывает, что ответ должен храниться только в частном кэше, таком как браузер пользователя. (Обычно используется вместе с max_age)
  • no_cache: Всегда проверяет действительность на сервере перед использованием кэша.
  • no_store: Запрещает кэшировать ответ вообще.

Пример:

# views.py
from django.utils.cache import cache_control

# Сохраняет ответ этого представления в кэше браузера на 1 час (3600 секунд)
@cache_control(max_age=3600)
def my_public_view(request):
    # ...
    return response

# Поскольку в этом представлении есть чувствительная пользовательская информация, оно сохраняется только в частном кэше (браузере) на 30 минут
@cache_control(private=True, max_age=1800)
def user_profile_view(request):
    # ...
    return response

2. @never_cache

Как следует из названия, этот декоратор настраивает ответ этого представления на то, чтобы его никогда не кэшировали.

Добавляет заголовок Cache-Control: max-age=0, no-cache, no-store, must-revalidate, настоятельно указывая браузеру не кэшировать ответ.

Пример: (Применяется основном на страницах оплаты, страницах критических форм и т.д.)

# views.py
from django.utils.cache import never_cache

@never_cache
def sensitive_form_view(request):
    # ...
    return response

Используется для установки заголовка Vary. Заголовок Vary играет важную роль в обозначении условий, при которых кэшированные ответы могут различаться.

Например, использование @vary_on_headers('User-Agent') позволяет кэшировать разные HTML для мобильных и десктопных User-Agent, помогая кэшу различать и сохранять оба варианта.

@vary_on_cookie используется, когда содержимое представления меняется в зависимости от значений cookie. (Например, когда статус входа/выхода зависит от сессионного cookie)

Пример:

# views.py
from django.views.decorators.vary import vary_on_headers, vary_on_cookie

# Кэшируется отдельно в зависимости от User-Agent (мобильный/десктопный) и Accept-Language (языковые настройки)
@vary_on_headers('User-Agent', 'Accept-Language')
def content_view(request):
    # ...
    return response

# Представление, где содержимое меняется в зависимости от куки (сессии)
@vary_on_cookie
def user_specific_view(request):
    # ...
    return response

Резюме



django.utils.cache является основным модулем, который помогает Django хорошо соблюдать HTTP-стандарты и эффективно обрабатывать клиентское кэширование.

Правильная настройка заголовков Cache-Control и Vary является ключевой стратегией, которая значительно снижает нагрузку на сервер и позволяет пользователям испытать более быструю скорость загрузки. В частности, использование декораторов этого модуля на статическом контенте или страницах с редко меняющимся списком может значительно улучшить производительность.