Ответ
В 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 %}
Вот и вся магия, блядь. Главное — не кэшировать то, что меняется каждую секунду, а то получишь пиздопроебибну, когда пользователи увидят вчерашние данные. Э, бошка, думай!