Wenn Sie ein Django-Entwickler sind, sind Sie vermutlich mit django.core.cache (Server-seitiger Cache) vertraut. Doch Django bietet auch eine weitere leistungsstarke Sammlung von Tools namens django.utils.cache, mit der Sie HTTP-Caching effektiv steuern können. Dieses Modul konzentriert sich darauf, die HTTP-Header zu verwalten, die entscheidend sind, um die Serverlast zu verringern und das Benutzererlebnis zu verbessern.

In diesem Beitrag werden wir die Hauptfunktionen und die Verwendung von django.utils.cache untersuchen.


django.core.cache vs. django.utils.cache



Dies ist der erste Punkt, den wir klären sollten.

  • django.core.cache (Server-seitiger Cache):

    • Speichert Ergebnisse von Datenbankabfragen, komplexen Berechnungen, Teilen von Templates usw. in Server-RAM, Redis, Memcached usw.
    • Zweck: Reduziert die Rechenlast auf dem Server, um die Antwortzeit zu verbessern.
  • django.utils.cache (HTTP-Cache / Client-seitiger Cache):

    • Setzt HTTP-Antwort-Header wie Cache-Control, Vary, ETag, Last-Modified.
    • Zweck: Weist den Browser oder den Proxy-Server an, Antworten zu cachen, sodass bei einer neuen Anfrage nicht erneut an den Server angefragt wird, sondern die gecachte Antwort verwendet wird.

Einfach gesagt, core.cache cached Daten, während utils.cache steuert, wie HTTP-Antworten cached werden.


Wichtige Dekoratoren und Funktionen

Das django.utils.cache Modul wird hauptsächlich in Form von Dekoratoren verwendet, die auf Views angewendet werden.

1. @cache_control

Der grundlegendste und zugleich leistungsstärkste Dekorator. Er ermöglicht eine feinkörnige Kontrolle des Cache-Control HTTP-Headers.

  • max_age: Die Gültigkeitsdauer des Caches (in Sekunden). Der Browser verwendet während dieser Zeit die gecachte Version.
  • public=True: Bedeutet, dass die Antwort im öffentlichen Cache (z. B. CDN, Proxy) gespeichert werden kann.
  • private=True: Bedeutet, dass die Antwort nur im privaten Cache (z. B. Browser des Benutzers) gespeichert werden sollte. (Wird normalerweise zusammen mit max_age verwendet)
  • no_cache: Weist den Browser an, vor der Verwendung des Caches immer die Gültigkeit beim Server zu überprüfen.
  • no_store: Verhindert, dass die Antwort gecached wird.

Beispiel:

# views.py
from django.utils.cache import cache_control

# Speichert die Antwort dieser View für 1 Stunde (3600 Sekunden) im Browser-Cache
@cache_control(max_age=3600)
def my_public_view(request):
    # ...
    return response

# Diese View enthält sensitive Benutzerinformationen, also wird sie nur 30 Minuten im privaten Cache (Browser) gespeichert
@cache_control(private=True, max_age=1800)
def user_profile_view(request):
    # ...
    return response

2. @never_cache

Wie der Name schon sagt, wird die Antwort dieser View niemals gecached.

Es wird der Header Cache-Control: max-age=0, no-cache, no-store, must-revalidate hinzugefügt, um den Browser klar anzuweisen, dass er die Antwort nicht cachen soll.

Beispiel: (wird hauptsächlich auf Zahlungsseiten, wichtigen Formularübermittlungsseiten usw. verwendet)

# views.py
from django.utils.cache import never_cache

@never_cache
def sensitive_form_view(request):
    # ...
    return response

Wird verwendet, um den Vary-Header festzulegen. Der Vary-Header spielt eine entscheidende Rolle dabei, zu kennzeichnen, unter welchen Bedingungen die gecachte Antwort variieren kann.

Zum Beispiel sorgt die Verwendung von @vary_on_headers('User-Agent') dafür, dass der Cache zwischen mobilem und Desktop User-Agent unterscheidet und unterschiedliche HTMLs bereitstellt.

@vary_on_cookie wird verwendet, wenn der Inhalt der View je nach Cookie-Wert variiert. (z. B. wenn der Anmeldestatus von Session-Cookies abhängt)

Beispiel:

# views.py
from django.views.decorators.vary import vary_on_headers, vary_on_cookie

# Speichert den Cache separat basierend auf User-Agent (mobil/Desktop) und Accept-Language (Spracheinstellung)
@vary_on_headers('User-Agent', 'Accept-Language')
def content_view(request):
    # ...
    return response

# View, deren Inhalt je nach Cookie (Session) variiert
@vary_on_cookie
def user_specific_view(request):
    # ...
    return response

Zusammenfassung



django.utils.cache ist ein zentrales Modul, das Django dabei unterstützt, den HTTP-Standard gut zu befolgen und Client-seitiges Caching präzise zu steuern.

Die geeignete Einstellung von Cache-Control und Vary-Headern ist eine wichtige Strategie, um den Serververkehr dramatisch zu reduzieren und den Benutzern schnellere Ladezeiten zu bieten. Insbesondere bei statischen Inhalten oder häufig unveränderten Listenseiten kann die Nutzung der Dekoratoren dieses Moduls zu erheblichen Leistungsverbesserungen führen.