Какие основные стратегии кеширования предоставляет Django

Ответ

Django предлагает многоуровневую систему кеширования для значительного повышения производительности путем сохранения результатов ресурсоемких операций. Можно кешировать как отдельные фрагменты данных, так и целые страницы.

Основные стратегии:

  1. Кеширование на уровне всего сайта (Per-Site Caching)

    Самый простой способ. Django кеширует все страницы, которые не изменяются для разных пользователей. Включается добавлением django.middleware.cache.UpdateCacheMiddleware и django.middleware.cache.FetchFromCacheMiddleware в MIDDLEWARE.

  2. Кеширование на уровне представления (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}")
  3. Кеширование фрагментов шаблона (Template Fragment Caching)

    Позволяет кешировать только определенные части шаблона с помощью тега {% cache %}. Полезно, когда страница в целом динамическая, но некоторые ее блоки (например, навигация, сайдбар) статичны.

    {% load cache %}
    
    {# Кешировать сайдбар на 1200 секунд (20 минут) #}
    {% cache 1200 sidebar %}
        <!-- Сложная логика для генерации сайдбара -->
        ...
    {% endcache %}
  4. Низкоуровневый 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 или кеш в базе данных).