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.