Что такое кеширование шаблонов в Django и как его включить

Ответ

Кеширование шаблонов в Django — это механизм, который сохраняет скомпилированный HTML-код шаблона в памяти, чтобы избежать его повторной компиляции при каждом запросе. Это значительно снижает нагрузку на CPU и ускоряет время ответа сервера, особенно для сложных шаблонов.

Принцип работы:

  1. При первом запросе Django находит, компилирует и рендерит шаблон.
  2. Скомпилированный объект шаблона сохраняется в кеш.
  3. При последующих запросах Django немедленно достает готовый объект из кеша, пропуская этапы поиска и компиляции.

Как включить:

Для активации необходимо в settings.py обернуть стандартные загрузчики шаблонов в django.template.loaders.cached.Loader.

# settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        # APP_DIRS: True говорит Django искать шаблоны в директориях приложений
        'APP_DIRS': False, 
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            # Оборачиваем загрузчики в 'cached.Loader'
            'loaders': [
                ('django.template.loaders.cached.Loader', [
                    'django.template.loaders.filesystem.Loader',
                    'django.template.loaders.app_directories.Loader',
                ]),
            ],
        },
    },
]

Важно: Кеширование загрузчика шаблонов включается только тогда, когда DEBUG = False. В режиме разработки оно неактивно, чтобы вы сразу видели изменения в файлах шаблонов.

Ответ 18+ 🔞

Да ты посмотри, какая дичь! Django, блядь, каждый раз, как какую-нибудь страничку рисует, он шаблон ищет, компилирует его в этот... в пиздопроебибный HTML, и только потом отдаёт. А представь, если шаблон сложный, с кучей наследований и тегов? Это ж, ёпта, процессор будет просто вздрачивать на каждом запросе, как последний бздун!

Так вот, умные дядьки придумали кеширование шаблонов. Суть проста, как три рубля, блядь:

  1. Первый раз, когда запросили страницу — всё по-честному: нашёл, скомпилировал, отрендерил, в рот меня чих-пых.
  2. А вот скомпилированный шаблон — эту самую готовую к работе хуйню — он засовывает в кеш, в память.
  3. А дальше, когда приходит следующий лох, он уже не компилирует нихуя, а сразу из кеша достаёт готовенькое и подставляет данные. Скорость — овердохуища!

Как это включить, чтобы не ебаться?

Лепишь в settings.py вот такую магию. Главное — обернуть своих загрузчиков в этого cached.Loader, как детишек в тёплое одеяло.

# settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        # Смотри, APP_DIRS теперь False! Иначе нихуя не заработает.
        'APP_DIRS': False,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            # А вот тут и происходит обёртывание. Видишь?
            'loaders': [
                ('django.template.loaders.cached.Loader', [
                    'django.template.loaders.filesystem.Loader',
                    'django.template.loaders.app_directories.Loader',
                ]),
            ],
        },
    },
]

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