Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB

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 хостинг.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
ГК
20 марта 2019 г. 9:01
Геннадий Костоянский

C++ - Тест 002. Константы

  • Результат:0баллов,
  • Очки рейтинга-10
ГК
20 марта 2019 г. 8:46
Геннадий Костоянский

C++ - Тест 002. Константы

  • Результат:25баллов,
  • Очки рейтинга-10
ГК
20 марта 2019 г. 8:00
Геннадий Костоянский

C++ - Тест 001. Первая программа и типы данных

  • Результат:100баллов,
  • Очки рейтинга10
Последние комментарии
MU
20 марта 2019 г. 15:43
Maciej Urmański

It's possible to simply add vote option for non logged users?
20 марта 2019 г. 9:45
Евгений Легоцкой

Добрый день. Поппробуйте домен localhost, а url соответственно http://localhost Возможно, потребуется указать порт. Например, так http://localhost:8000
19 марта 2019 г. 12:57
AlexanderBardin

Добрый день. А проверить работоспособность локально как-то можно не указывая реальнй сайт (еще в разработке)
16 марта 2019 г. 13:55
Дмитрий

Спасибо за статью. Давно итересует следующий вопрос: с помощью переменных QMAKE_TARGET_COMPANYQMAKE_TARGET_PRODUCTQMAKE_TARGET_DESCRIPTIONможно задать свойства компилируемой программы, о...
JS
12 марта 2019 г. 10:19
Jean Stefanovich

Большое спасибо за разъяснения!
Сейчас обсуждают на форуме
20 марта 2019 г. 12:26
Евгений Легоцкой

Лучше стараться избегать этого. Нормального механизма нет. Я просто выдёргиваю из бэкенда перевёденные куски шаблона, если нужно что-то задействовать в JS.
17 марта 2019 г. 22:47
Евгений Легоцкой

Добрый день. Вот, нашлось у меня немного времени. Делается это через шаблон проектирования наблюдатель. GraphKS_mfvSlup.zip
ЧГ
15 марта 2019 г. 21:52
Чарльз Грин

спасибо, попробую, отпишусь
m
15 марта 2019 г. 19:41
mihamuz

Сори догадался)
n
12 марта 2019 г. 16:57
newbie.works.with.QT

Большооооое спасибо!!!!!Не передать как я вам благодарен, спасибо что всегда отзываетесь.Теперь я смогу продолжить работу в QT!!! (пробую писать бота (Я как вы могли догадаться немного не пр...
Присоединяйтесь к нам в социальных сетях

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