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

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

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

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

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

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

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

  1. {% load i18n cache %}
  2. {% get_current_language as LANGUAGE_CODE %}
  3. {% cache 6000 sidebar LANGUAGE_CODE %}
  4. {% load sidebar sidebar_sticky from evileg_widgets %}
  5. {% sidebar %}
  6. {% sidebar_sticky %}
  7. {% endcache %}

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

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

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

  1. # -*- coding: utf-8 -*-
  2.  
  3. from django.conf import settings
  4. from django.core.cache import cache
  5. from django.db import models
  6. from django.core.cache.utils import make_template_fragment_key
  7. from django.db.models.signals import post_save, post_delete
  8. from solo.models import SingletonModel
  9. # Some another imports
  10.  
  11.  
  12.  
  13. class SideBar(SingletonModel):
  14. # Some code of model
  15.  
  16.  
  17. class Widget(models.Model):
  18. # Some code of model
  19.  
  20.  
  21. def invalidate_cache(**kwargs):
  22. for code, description in settings.LANGUAGES:
  23. cache.delete(make_template_fragment_key('sidebar', [code]))
  24.  
  25. post_save.connect(invalidate_cache, sender=SideBar)
  26. post_save.connect(invalidate_cache, sender=Widget)
  27. post_delete.connect(invalidate_cache, sender=Widget)

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

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

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

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

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

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

  1. TEMPLATES = [
  2. {
  3. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  4. 'DIRS': [ os.path.join(BASE_DIR, 'templates') ],
  5. 'OPTIONS': {
  6. # some another options
  7. 'loaders': [
  8. ('django.template.loaders.cached.Loader', [
  9. 'django.template.loaders.filesystem.Loader',
  10. 'django.template.loaders.app_directories.Loader',
  11. ]),
  12. ],
  13. },
  14. },
  15. ]

Висновок

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

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…