Evgenii Legotckoi
19 березня 2023 р. 02:09

Django - Урок 060. Прискорення сайту за допомогою кешування шаблонів та їх частин

Одним із способів значно прискорити швидкість роботи сайту на Django – це кешування як окремих частин шаблонів сайту, так і кешування шаблонів після їх компілювання сайтом. Тому вивчимо обидва ці способи покращення швидкості роботи сайту, окрім вже відомого нам способу правильної оптимізації запитів до бази даних Django . Перевіряти результативність поліпшень можна за допомогою батарейки django-silk, що й описано в статті з поліпшення запитів до бази даних.

А тепер розглянемо варіанти використання кешування.

Кешування елементів шаблонів

У тих випадках, коли у вас є частини шаблонів, що генеруються, як наприклад нижній колонтитул сайту (Footer) або бічні панелі (SideBar), то можна використовувати кешування цих частин сайту. Наприклад, я закешував не тільки їх, але навіть і Navigation Drawer сайту та верхню навігаційну панель. Зроблено це було з тієї причини, що я використовую для генерування посилань навігації вбудовані теги url а також теги перекладу trans , яких набирається велика кількість, і разом вони додають пристойне навантаження на сайт. Не кажучи вже про те, що у мене використовуються віджети, що динамічно настроюються (про це ви можете прочитати в статті про поліморфну систему динамічних віджетів . І саме ці віджети при кожному завантаженню можуть подвоїти або навіть потроїти час генерування сторінки сайту, а якщо врахувати, що види віджетів можуть бути різними, то й написати досить ефективний запит до бази даних вже не вийде, тому найпростіше закшувати ці частини шаблону сайту.

Це буде виглядати так

{% load i18n cache %}
{% get_current_language as LANGUAGE_CODE %}
{% cache 6000 sidebar LANGUAGE_CODE %}
  {% load sidebar sidebar_sticky from evileg_widgets %}
  {% sidebar %}
  {% sidebar_sticky %}
{% endcache %}

У цьому коді використовується тег cache, що вбудовується, в який передається ключ кеша sidebar , а також в якості додаткового параметра код мови LANGUAGE_CODE . Код мови необхідний, щоб підтримувати мультимовність сайту.

В даному випадку з динамічними віджетами виникає важливий нюанс, а саме інвалідування кешу в тому випадку, якщо SideBar з динамічними віджетами було змінено через адміністративну панель сайту.

Так ось, це реалізував так:

# -*- coding: utf-8 -*-

from django.conf import settings
from django.core.cache import cache
from django.db import models
from django.core.cache.utils import make_template_fragment_key
from django.db.models.signals import post_save, post_delete
from solo.models import SingletonModel
# Some another imports



class SideBar(SingletonModel):
    # Some code of model


class Widget(models.Model):
    # Some code of model


def invalidate_cache(**kwargs):
    for code, description in settings.LANGUAGES:
        cache.delete(make_template_fragment_key('sidebar', [code]))

post_save.connect(invalidate_cache, sender=SideBar)
post_save.connect(invalidate_cache, sender=Widget)
post_delete.connect(invalidate_cache, sender=Widget)

Як бачите з коду, тут використовується система сигналів, що дуже схоже на систему сигналів і слотів в Qt , що мені як Qt розробнику дуже сподобалося.

Так ось, дана система сигналів та слотів інвалідує кеш у тому випадку, якщо було змінено як сам об'єкт SideBar, так і в якомусь із віджетів. Причому інвалідність відбувається одразу для всіх мов. Таким чином, важкі запити до бази даних виникають не частіше, ніж раз на 6000 секунд. Що цілком прийнятно.

Кешований завантажувач шаблонів

Наступним способом підвищення продуктивності сайту є використання кешованого завантажувача шаблонів. Справа в тому, що зазвичай Django шукає шаблони при кожному зверненні до сторінки сайту, якщо ж налаштувати кешування у завантажувача шаблонів, то продуктивність сайту може зрости вдвічі.

Наприклад, у мене час генерування деяких сторінок сайту після включення цієї опції зменшився з 220-240 мс до 120-130. Звичайно це з урахуванням і багатьох інших хитрощів для підвищення продуктивності. Але результат дуже хороший.

А налаштування даного функціоналу здійснюється у файлі settigns.py і виглядати це має так.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [ os.path.join(BASE_DIR, 'templates') ],
        'OPTIONS': {
            # some another options
            'loaders': [
                ('django.template.loaders.cached.Loader', [
                    'django.template.loaders.filesystem.Loader',
                    'django.template.loaders.app_directories.Loader',
                ]),
            ],
        },
    },
]

Висновок

Дуже рекомендую закешувати частини шаблону, навіть якщо там всього лише виклики тегів url або trans , у глобальній перспективі це може вплинути на якість вашого сайту для пошукових систем. Адже не дарма в інтернеті так багато статей, в яких говориться, що пошукові системи підвищують у видачі дуже швидкі сайти.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up