Link Search Menu Expand Document

Кэширование

Кэш необходим для снижения нагрузки на сервер.

Подробнее про кэширование

Существует 3 типа кэширования:

  1. В оперативную память
  2. В БД
  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}

Суть метода в том что мы перед получением данных из БД проверяем есть ли они в кэше, и если есть, берем оттуда. Если там их нет – берем данные из БД и помещаем их в кэш.