Evgenii Legotckoi
Evgenii Legotckoi5. Januar 2019 09:49

Django - Tutorial 042. Caching-Vorlagen für verschiedene Arten von Inhalten

Inhalt

In Django – Lektion 035. Unterschiedliche Vorlagen zum Rendern verschiedener Arten von Inhalten in Suchergebnissen wurde gezeigt, wie unterschiedliche Vorlagen je nach Inhaltstyp gerendert werden in den Ergebnissen der Site-Suche gerendert werden. Dabei war der entscheidende Punkt, dass es nicht erforderlich war, Bedingungen für die Überprüfung der Auswahl einer Vorlage zu stellen. Die Sprechblaseninformationen wurden in der Variablen TEMPLATE_PREVIEW gespeichert, über die die Vorlage in das enthaltene Tag in der Django-Vorlage eingefügt wurde.

{% include object.TEMPLATE_PREVIEW %}

Diese Methode hat einen großen Nachteil. Tatsache ist, dass das include-Tag bei jedem Aufruf nach einem Template sucht. Bei starker Auslastung der Website kann dies die Dauer der Antwort des Servers erheblich verlängern. Um dieses Problem zu lösen, müssen Sie das Muster irgendwie zwischenspeichern. Da unterschiedliche Inhaltstypen unterschiedliche Templates verwenden, ist dies mit include_tag ziemlich problematisch.

Dieses Problem wurde behoben, indem die Vorlage auf Klassenebene als Klassenvariable zwischengespeichert wurde.


Dieser Mechanismus kann mit einem Mixin implementiert werden.

class EInterfaceMixin:
    TEMPLATE_FULL = 'full.html'     # путь к шаблону
    template_full = None            # pattern caching variable

    # we will cache with the help of the class method, in which we pass the object for rendering, as well as the context of the request
    # request context is required to provide rendering functionality that is dependent on the current user
    @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']})

    # method to render using context
    def render_template_full(self, request_context):
        return self.__render_template_full(self, request_context)

Der nächste Schritt besteht darin, das integrierte Tag zu registrieren. Dies ist notwendig, um den Anforderungskontext beim Rendern im Template aufzunehmen. In meinem Fall können einige der Vorlagen ohne Informationen über den aktuellen Benutzer, der sich auf der Website befindet, nicht korrekt angezeigt werden.

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

In Vorlage verwenden

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

Fazit

Dieses Mixin kann allen Modellen hinzugefügt werden, die diese Render-Engine verwenden.

Beim ersten Aufruf einer Klassenmethode wird die Vorlage zwischengespeichert. Nachfolgende Renderaufrufe verwenden die bereits zwischengespeicherte Vorlage. Somit wird bei jedem Aufruf des include -Tags keine unnötige CPU-Zeit mit der Suche nach einer Vorlage verschwendet.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken