Django - Урок 042. Кэширование шаблонов для различных типов контента

templatetags, template, Django

В Django - Урок 035. Различные шаблоны для рендеринга разных типов контента в поисковой выдаче было показано, как сделать рендеринг различных шаблонов в зависимости от того, какой тип контента отрисовывается в поисковой выдаче на сайте. При этом ключевым моментом являлось то, что не приходилось делать проверочные условия для выбор шаблона. Информация о шбалоне хранилась в переменной TEMPLATE_PREVIEW, через которую шаблон подставлялся в include тег в шаблоне Django.

{% include object.TEMPLATE_PREVIEW %}

В данном способе есть один большой недостаток. Дело в том, что тег include при каждом своём вызове ищет шаблон. При большой нагрузке на сайт - это может значительно увеличить длительность ответа от сервера. Чтобы решить эту проблему, необходимо каким-то образом закэшировать шаблон. Поскольку разные виды контента используют различные шаблоны, то сделать это с использованием inclusion_tag является довольно проблематичным.

Решить данную проблему удалось с помощью кэширования шаблона на уровне класса в качестве классовой переменной.

Реализовать данный механизм можно с помощью миксина

class EInterfaceMixin:
    TEMPLATE_FULL = 'full.html'     # путь к шаблону
    template_full = None            # переменная для кэширования шаблона

    # кэшировать будем с помощью классового метода, в который передаём объект для рендеринга, а также context запроса
    # контекст запроса необходим, чтобы обеспечить функционал рендеринга, имеющий зависимость на текущего пользователя
    @classmethod
    def __render_template_full(cls, obj, request_context):
        if not cls.template_full:
            cls.template_full = loader.get_template(cls.TEMPLATE_FULL)
        return cls.template_full.render({'object': obj, 'user': request_context['user']})

    # метод для выполнения рендеринга с использованием контекста
    def render_template_full(self, request_context):
        return self.__render_template_full(self, request_context)

Далее нужно зарегистрировать built-in тег. Это необходимо, чтобы при рендеринге в шаблоне забрать контекст запроса. В моём случае часть шаблонов не могут быть корректно отображены без информации о текущем пользователе, который находится на сайте.

@register.simple_tag(takes_context=True)
def render_template_full(context, obj):
    if obj:
        return obj.render_template_full(context)
    return ''

Использование в шаблоне

{% load render_template_full from core %}
{% for object in object_list %}
    {% render_template_full object %}
{% empty %}

Заключение

Этот миксин можно добавить ко всем моделям, которые будут использовать данный механизм рендеринга.

При первом вызове классового метода будет выполнено кеширование шаблона. При последущих вызовах рендеринга будет исползоваться уже закешированный шаблон. Таким образом не будет бесполезного расхода процессорного времени на поиск шаблонов при каждом вызове тега include

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
m
19 мая 2019 г. 1:49
mahhaki

Qt - Тест 001. Сигналы и слоты

  • Результат:78баллов,
  • Очки рейтинга2
S
17 мая 2019 г. 13:14
SunBro

Qt - Тест 001. Сигналы и слоты

  • Результат:42баллов,
  • Очки рейтинга-8
b
17 мая 2019 г. 4:18
banana

C++ - Тест 003. Условия и циклы

  • Результат:57баллов,
  • Очки рейтинга-2
Последние комментарии
P.
18 мая 2019 г. 14:03
PELMYACH .

Спасибо большое! Вскоре буду разбираться!
18 мая 2019 г. 9:13
Евгений Легоцкой

Добрый день! Отнимать значение общего счётчика можно в деструкторе класса кнопки QDynamicButton::~QDynamicButton(){ ResID--;} При этом я бы ещё переустанавливал значения вс...
P.
14 мая 2019 г. 22:33
PELMYACH .

Здравствуйте!А не подскажите, как можно при удалении какой либо кнопки, у щётчика отнять значение?Дабы например четвёртой кнопке соответствовал ID 4, а не 5 скажем
6 мая 2019 г. 6:39
Евгений Легоцкой

Добрый день. Этот урок для Qt Quick Control версии 1, Вы используете вторую версию. Здесь style уже нет, кастомизацию можно делать уже или черещ соответствующие property или через ...
U
4 мая 2019 г. 3:14
Unreal_man

Делаю вроде правильно, а ничего не получается. Что упустил? После button1. в выпадающем списке нет style.Да, и откуда в уроке взялся файл .pri и зачем он нужен?
Сейчас обсуждают на форуме
19 мая 2019 г. 12:45
Михаиллл

Скачал openssl-1.1.1 от сюда , но не понимаю что делать с этой папкой
19 мая 2019 г. 10:52
Евгений Легоцкой

Если честно, то мне нужно самому время потратить, чтобы глянуть это дело. Я использовал Flutter для разработки, а не Qt. Просто исходя из опыта, могу сказать, что по большей части всё на эмуля...
16 мая 2019 г. 23:08
BlinCT

Решил через indexOf сделать. Возвращает или номер позиции где нашел символ или строку или -1 если не найдено.
15 мая 2019 г. 15:06
Михаиллл

Спасибо , заработало.Получаю ответный сигнал.Но теоретически, в ответ на запрос должен прийти json файл. Скажите пожалуйста, как можно открыть ответные данные, прочитать их, и потом удалить...
14 мая 2019 г. 11:07
Евгений Легоцкой

Из той задачи, которую вы привели, у вас есть база данных и таблица в ней с текстами. Для представления данных из базы данных обычно используют QTableView, а text browser здесь не к мест...

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
Присоединяйтесь к нам
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB