Ответ
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 или кеш в базе данных).
Ответ 18+ 🔞
Ну, слушай, а знаешь, что в Django есть такая штука, чтобы всё не тормозило, как старая телега? Это кеширование, блядь! Всё, что считается долго, можно просто запомнить и не пересчитывать каждый раз. Просто сказка, а не инструмент, ёпта!
Смотри, как это работает, нахуй:
-
Кешировать весь сайт (Per-Site Caching) Это как самый тупой, но иногда самый действенный способ. Сказал системе: «Запомни всё, что отдаёшь, и не парься». Включается двумя строчками в настройках, и всё, блядь, страницы начинают летать. Правда, годится только если у тебя сайт для всех одинаковый, без «Привет, Вася» в шапке.
-
Кешировать отдельные вьюхи (Per-View Caching) А вот это уже тоньше. Накинул декоратор на функцию, которая рендерит страницу, и вуаля — результат её работы запоминается. Идеально для всяких «О нас» или прайс-листов, которые меняются раз в год, если повезёт.
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"Страница отрендерена в {now}")Теперь, пока кеш не протухнет, все будут видеть одно и то же время, как бы они ни обновляли страницу. Магия, блядь!
-
Кешировать куски шаблона (Template Fragment Caching) Это вообще хитрая жопа! Представь: страница в целом динамическая, но вот этот чёртов сайдбар с кучей запросов к базе генерируется три часа. Так зачем его каждый раз пересчитывать? Обернул этот кусок в шаблоне специальным тегом — и он закешировался отдельно. Гениально же!
{% load cache %} {# Говорим: «Эту панельку запомни на 20 минут, ключ — 'sidebar'» #} {% 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 = ... # Тут твоя ресурсоёмкая операция, от которой сервер плачет # А теперь сохраняем это добро в кеш на час, чтобы больше не страдать cache.set('my_heavy_data_key', data, 3600) return data
Только не забудь, чувак, для всего этого великолепия в settings.py надо настроить бэкенд — сказать системе, куда это всё запоминать. В memcached, в redis или, на худой конец, в саму базу данных. Без этого вся твоя возня — просто пиздёж, а не оптимизация.