Как настроить и использовать кэширование в Django

Ответ

В Django встроен мощный фреймворк кэширования. Процесс состоит из настройки и применения на разных уровнях.

Шаг 1: Настройка в settings.py

Сначала необходимо определить бэкенд кэша. Выбор зависит от задачи:

  • LocMemCache: Локальная память процесса. Быстро, но не разделяется между процессами. Идеально для разработки.
  • FileBasedCache: Файловая система. Медленнее, но надежно.
  • DatabaseCache: База данных. Легко настроить, но является самым медленным вариантом.
  • RedisCache / MemcachedCache: Внешние in-memory хранилища. Рекомендуются для production благодаря высокой производительности.

Пример конфигурации для Redis:

# settings.py
CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.redis.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
    }
}

Шаг 2: Способы использования

1. Низкоуровневый API Для кэширования результатов вычислений или запросов к БД.

from django.core.cache import cache

def get_complex_data():
    data = cache.get('my_complex_data_key')
    if data is None:
        # Логика получения данных (например, из БД)
        data = ... 
        cache.set('my_complex_data_key', data, timeout=3600) # Кэш на 1 час
    return data

2. Кэширование представлений (Views) Декоратор cache_page кэширует всю страницу целиком.

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)  # Кэшировать на 15 минут
def my_view(request):
    # ...

3. Кэширование фрагментов шаблона Тег {% cache %} позволяет кэшировать ресурсоемкие части шаблона, например, боковую панель с категориями.

{% load cache %}

{% cache 500 sidebar %}
    <!-- Этот фрагмент будет закэширован на 500 секунд -->
    ... sidebar content ...
{% endcache %}

Ответ 18+ 🔞

Да ты посмотри, какой у Django, блядь, инструмент для кэширования! Прямо овердохуища возможностей, ёпта. Но чтобы не накосячить, надо по шагам, как нормальный человек, а не как мартышлюшка.

Шаг первый: Ковыряемся в settings.py

Тут надо выбрать, куда будем складывать наш кэш. Вариантов — как говна за баней, но не все одинаково полезны.

  • LocMemCache: В память текущего процесса. Быстрее ветра, но если у тебя несколько воркеров — у каждого свой кэш, и они друг другу нихуя не покажут. Для разработки — самое то.
  • FileBasedCache: В файлы на диске. Надёжно, как старый тапок, но по скорости — не фонтан.
  • DatabaseCache: Прямо в базу данных. Настроить — раз плюнуть, но по скорости это, блядь, антикэш. Хуже не придумаешь.
  • RedisCache / MemcachedCache: Вот это, сука, серьёзные пацаны для продакшена. Хранят всё в оперативке, летает. Надо только отдельный сервак поднять.

Вот тебе пример, как на Redis завязаться:

# settings.py
CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.redis.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1", # Смотри, не перепутай порт, а то будешь искать хуй с горы
    }
}

Шаг второй: Как этим богатством пользоваться

1. Низкоуровневый API — для ручных кастомных пизюлек Допустим, у тебя есть функция, которая ебёт мозг базе данных. Чтобы не дрочить её каждый раз, можно результат припрятать.

from django.core.cache import cache

def get_complex_data():
    data = cache.get('my_complex_data_key')
    if data is None:
        # Вот тут та самая тяжёлая хуйня, от которой сервер плачет
        data = ... 
        # И кладём результат в закрома на час (3600 секунд)
        cache.set('my_complex_data_key', data, timeout=3600)
    return data

2. Кэширование целых страниц (Views) Ленивый способ — обернуть вьюху декоратором cache_page. Всё, пиздец, отдаётся из кэша.

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)  # Сиди в кэше 15 минут и не выёбывайся
def my_view(request):
    # ...

3. Кэширование кусков шаблона Бывает, что вся страница — говно, а вот какой-нибудь сайдбар с кучей запросов — реальная проблема. Его и закэшируем.

{% load cache %}

{% cache 500 sidebar %}  <!-- 500 секунд покоя -->
    <!-- Этот сайдбар теперь не будет ебать базу каждые пять секунд -->
    ... sidebar content ...
{% endcache %}

Вот и вся магия, блядь. Главное — не кэшировать то, что меняется каждую секунду, а то получишь пиздопроебибну, когда пользователи увидят вчерашние данные. Э, бошка, думай!