Evgenii Legotckoi
Evgenii Legotckoi18 березня 2023 р. 16: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 , у глобальній перспективі це може вплинути на якість вашого сайту для пошукових систем. Адже не дарма в інтернеті так багато статей, в яких говориться, що пошукові системи підвищують у видачі дуже швидкі сайти.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

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

Коментарі

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

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 08:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 08:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
i
innorwall15 листопада 2024 р. 03:03
Qt/C++ - Урок 060. Налаштування зовнішнього вигляду програми під час виконання I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
i
innorwall14 листопада 2024 р. 19:42
Як скопіювати файли в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
i
innorwall14 листопада 2024 р. 17:09
Qt/C++ - Підручник 068. Hello World за допомогою системи збирання CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
i
innorwall14 листопада 2024 р. 12:05
EVILEG-CORE. Використання Google reCAPTCHA 2001; 98 29 34 priligy buy
Тепер обговоріть на форумі
i
innorwall14 листопада 2024 р. 11:39
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwall11 листопада 2024 р. 18:55
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9Anonim25 жовтня 2024 р. 16:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов03 жовтня 2024 р. 11:05
Реализация навигации по разделам Спасибо Евгений!

Слідкуйте за нами в соціальних мережах