Как кэшировать результаты запросов в Django (cache framework)?
Подробный ответ
Зачем нужен кэш
Кэш помогает не выполнять повторно дорогие операции: сложные SQL-запросы, обращения к внешним API, генерацию HTML или вычисления. Вместо повторного расчёта приложение возвращает сохранённый результат, пока не истечёт TTL или кэш не будет сброшен.
Настройка backend
Настройки кэша задают в словаре CACHES. Для production обычно выбирают Redis или Memcached; локальный in-memory backend удобен для разработки, но не подходит для распределённой среды.
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
}
}Низкоуровневый API
from django.core.cache import cache
articles = cache.get('published_articles')
if articles is None:
articles = list(Article.objects.filter(is_published=True))
cache.set('published_articles', articles, timeout=300)Кэширование view
from django.views.decorators.cache import cache_page
@cache_page(60 * 5)
def article_list(request):
...Инвалидация кэша
Ключевая часть кэширования — продумать, когда данные устаревают. Кэш можно очищать при изменении модели, через явный cache.delete(), versioned keys или ограниченный TTL. Для критичных данных нельзя полагаться только на большой TTL.
Как ответить на собеседовании
Я настраиваю cache backend, например Redis, и выбираю уровень кэширования: результат функции через cache API, весь view или фрагмент шаблона. При этом заранее определяю ключи, TTL и стратегию инвалидации при обновлении данных.
Оцени свой прогресс