Кэширование
Кэш необходим для снижения нагрузки на сервер.
Существует 3 типа кэширования:
- В оперативную память
- В БД
- В файловую систему
Мы будем рассматривать вариант кэширования в файловую систему
Создадим директорию django_cache
в корне нашего сайта
В файле settings.py
добавим:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': os.path.join(BASE_DIR, 'django_cache'),
}
}
Кэширование для контроллеров функций
Если нам необходимо кэширование для контроллеров-классов, то нам нужно кэшировать на уровне представления в URLconf
Для этого добавим в файл urls.py
подключение библиотеки:
from django.views.decorators.cache import cache_page
а страницу, которую необходимо кэшировать, изменим следующим образом:
path('', cache_page(60 * 15)(HomeNews.as_view()), name='home'),
То есть мы добавим вызов функции cache_page
.
Кэширование фрагментов шаблона
Будем кэшировать сайдбар.
Для того, чтобы в шаблоне закэшировать какую-то его часть, необходимо вызвать следующие тэги:
{% load cache %}
{% cache 30 sidebar %}
{% block который_мы_будем_кэшировать %}ЧТО_КЭШИРУЕМ{% endblock %}
{% endcache %}
Первым параметром мы указываем количество секнд жизни кэша. Вторым параметром мы присваем кэшу какое-то имя.
API низкого уровня для кэширования
Мы также можем производить кэширование информации из БД непосредственно при её получении. Для этого (для примера) в файле news_tags.py
мы подключаем библиотеку:
from django.core.cache import cache
и немного изменим функцию вывода категорий новостей:
@register.inclusion_tag('news/list_categories.html')
def show_categories():
categories = cache.get('categories')
if not categories:
categories = Category.objects.annotate(cnt=Count('news', filter=F('news__is_published'))).filter(cnt__gt=0)
cache.set('categories', categories, 30)
return {'categories': categories}
Суть метода в том что мы перед получением данных из БД проверяем есть ли они в кэше, и если есть, берем оттуда. Если там их нет – берем данные из БД и помещаем их в кэш.