Ответ
Django предлагает многоуровневую систему кеширования для значительного повышения производительности путем сохранения результатов ресурсоемких операций. Можно кешировать как отдельные фрагменты данных, так и целые страницы.
Основные стратегии:
-
Кеширование на уровне всего сайта (Per-Site Caching)
Самый простой способ. Django кеширует все страницы, которые не изменяются для разных пользователей. Включается добавлением
django.middleware.cache.UpdateCacheMiddleware
иdjango.middleware.cache.FetchFromCacheMiddleware
вMIDDLEWARE
. -
Кеширование на уровне представления (Per-View Caching)
Применяется к отдельным представлениям с помощью декоратора
cache_page
. Идеально для страниц, которые обновляются редко.from django.views.decorators.cache import cache_page from django.http import HttpResponse import datetime # Кешировать результат этого представления на 15 минут @cache_page(60 * 15) def my_view(request): now = datetime.datetime.now() return HttpResponse(f"Page rendered at {now}")
-
Кеширование фрагментов шаблона (Template Fragment Caching)
Позволяет кешировать только определенные части шаблона с помощью тега
{% cache %}
. Полезно, когда страница в целом динамическая, но некоторые ее блоки (например, навигация, сайдбар) статичны.{% load cache %} {# Кешировать сайдбар на 1200 секунд (20 минут) #} {% cache 1200 sidebar %} <!-- Сложная логика для генерации сайдбара --> ... {% endcache %}
-
Низкоуровневый API кеша (Low-Level Cache API)
Дает полный контроль над тем, что и как кешировать. Можно сохранять результаты любых вычислений, запросов к базе данных и т.д.
from django.core.cache import cache def get_heavy_data(): data = cache.get('my_heavy_data_key') if data is None: # Данных в кеше нет, вычисляем их data = ... # ресурсоемкая операция # Сохраняем в кеш на 1 час cache.set('my_heavy_data_key', data, 3600) return data
Для работы кеша необходимо настроить бэкенд в settings.py
(например, memcached
, redis
или кеш в базе данных).