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 р. 01:37

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

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

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

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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