Evgenii Legotckoi
Evgenii Legotckoi18. März 2023 16:09

Django - Lektion 060. Beschleunigen Sie Ihre Website, indem Sie Vorlagen und ihre Teile zwischenspeichern

Eine der Möglichkeiten, die Geschwindigkeit einer Django-Site erheblich zu beschleunigen, besteht darin, sowohl einzelne Teile der Site-Vorlagen als auch die Vorlagen zwischenzuspeichern, nachdem sie von der Site kompiliert wurden. Daher werden wir diese beiden Methoden untersuchen, um die Geschwindigkeit der Website zu verbessern, zusätzlich zu der Methode, die wir bereits kennen die korrekte Optimierung von Abfragen an die Django-Datenbank . Sie können die Wirksamkeit von Verbesserungen immer noch mit der Django-Silk-Batterie testen, die im Artikel zur Verbesserung von Datenbankabfragen beschrieben wird.

Sehen wir uns nun die Optionen für die Verwendung von Caching an.

Zwischenspeichern von Teilen von Vorlagen

In Fällen, in denen Sie Teile der Vorlagen generiert haben, wie z. B. die Fußzeile der Website (Footer) oder Seitenleisten (SideBar), ist es möglich, das Caching dieser Teile der Website zu verwenden. Zum Beispiel habe ich sie nicht nur zwischengespeichert, sondern sogar die Navigationsleiste und die obere Navigationsleiste der Website. Dies geschah, weil ich url -einbettbare Tags und trans -Übersetzungs-Tags verwende, um Navigationslinks zu generieren, die viele Typen sind, und zusammen fügen sie der Website eine anständige Auslastung hinzu. Ganz zu schweigen davon, dass ich dynamisch konfigurierbare Widgets verwende (Sie können darüber im Artikel über das polymorphe System dynamischer Widgets nachlesen). Und genau diese Widgets sind es Jeder Ladevorgang kann die Zeit verdoppeln oder sogar verdreifachen, die zum Generieren einer Site-Seite benötigt wird, und da die Arten von Widgets sehr unterschiedlich sein können, ist es nicht möglich, eine einigermaßen effiziente Datenbankabfrage zu schreiben. Daher ist es am einfachsten zu codieren diese Teile der Websitevorlage.

Es wird so aussehen

{% 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 %}

Dieser Code verwendet das einbettbare Cache-Tag, dem der Cache-Schlüssel sidebar übergeben wird, sowie den Sprachcode LANGUAGE_CODE als zusätzlichen Parameter. Der Sprachcode ist erforderlich, um die mehrsprachige Website zu unterstützen.

In diesem Fall tritt bei dynamischen Widgets eine wichtige Nuance auf, nämlich die Cache-Invalidierung, wenn die SideBar mit dynamischen Widgets über das Verwaltungspanel der Website geändert wurde.

Also ist es so implementiert:

# -*- 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)

Wie Sie dem Code entnehmen können, wird hier ein System von Signalen verwendet, das übrigens dem System [Signale und Slots in Qt] sehr ähnlich ist (https://evileg.com/en/post/87/ ), was mir als Qt-Entwickler sehr gut gefallen hat.

Dieses System von Signalen und Slots macht also den Cache ungültig, wenn sowohl das SideBar-Objekt selbst als auch in einem der Widgets geändert wurden. Außerdem erfolgt die Invalidierung sofort für alle Sprachen. Daher treten umfangreiche Datenbankabfragen nicht mehr als einmal alle 6000 Sekunden auf. Was durchaus akzeptabel ist.

Lader für zwischengespeicherte Vorlagen

Und die nächste Möglichkeit zur Verbesserung der Site-Performance ist die Verwendung eines zwischengespeicherten Vorlagenladeprogramms. Tatsache ist, dass Django normalerweise bei jedem Zugriff auf eine Site-Seite nach Vorlagen sucht, aber wenn Sie das Caching im Template-Loader einrichten, kann sich die Site-Performance verdoppeln.

Nach Aktivierung dieser Option verringerte sich beispielsweise die Zeit zum Generieren einiger Seiten der Website von 220-240 ms auf 120-130 ms. Dies berücksichtigt natürlich viele andere Optimierungen, um die Leistung zu verbessern. Das Ergebnis ist jedoch sehr gut.

Und die Einstellung dieser Funktionalität erfolgt in der Datei settigns.py und sollte so aussehen.

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',
                ]),
            ],
        },
    },
]

Abschluss

Es wird dringend empfohlen, Teile der Vorlage zwischenzuspeichern, selbst wenn es sich nur um Aufrufe von url - oder trans -Tags handelt, kann dies global gesehen die Qualität Ihrer Website für Suchmaschinen beeinträchtigen. Nicht umsonst gibt es im Internet so viele Artikel, die besagen, dass Suchmaschinen sehr schnell Seiten in den Suchergebnissen erhöhen.

Рекомендуємо хостинг 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