Если вы разработчик 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. - Цель: Указать браузеру или прокси-серверу кэшировать ответ, чтобы, когда тот же запрос возникает снова, использовать кэшированный ответ без повторного запроса к серверу.
- Устанавливает HTTP-заголовки ответа, такие как
Проще говоря, 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
3. @vary_on_headers / @vary_on_cookie
Используется для установки заголовка 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 является ключевой стратегией, которая значительно снижает нагрузку на сервер и позволяет пользователям испытать более быструю скорость загрузки. В частности, использование декораторов этого модуля на статическом контенте или страницах с редко меняющимся списком может значительно улучшить производительность.
Комментариев нет.