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