Ich versuche, Abfrageergebnisse in meiner Django-App zwischenzuspeichern. Es scheint jedoch, dass es die ganze App zwischenspeichert. Ich habe versucht, logi:
%Vor%Ich rufe diese Methode an, wenn sich der Benutzer anmeldet. Wenn ich mich jedoch nach dem Login abmelden will, halte ich mich auf derselben Seite wie wenn ich noch eingeloggt bin. Ich habe versucht, die Django Dokumentation über den Cache bei Ссылка aber ohne Erfolg.
Eine andere Sache, die ich ausprobiert habe, ist, dass wenn ich versuche, den Cache-Decorator direkt über der Ansicht als:
zu verwenden %Vor%es gibt einen Fehler, der besagt, dass "Antwortheader nicht definiert" ist. Ich bin neu im Django und sicher, dass ich etwas verpasst habe. Irgendeine Idee?
RTFM :) Offizielle Django-Dokumente: Caching und QuerySets
Jedes QuerySet enthält einen Cache, um den Datenbankzugriff zu minimieren. (...)
und:
In einem neu erstellten QuerySet ist der Cache leer. Wenn ein QuerySet zum ersten Mal ausgewertet wird und eine Datenbankabfrage stattfindet, speichert Django die Abfrageergebnisse im Cache des QuerySets und gibt die explizit angeforderten Ergebnisse zurück (z. B. das nächste Element, wenn das QuerySet iteriert wird Über). Nachfolgende Auswertungen des QuerySets verwenden die zwischengespeicherten Ergebnisse erneut.
Caching wird automatisch im Falle von QuerySets (Ergebnisse von Abfragen) durchgeführt.
BEARBEITEN:
Wie für Ihren Code in der Frage eingefügt.
Wenn der Schlüssel noch nicht im Cache vorhanden ist, müssen Sie ihn mit der Methode add()
erstellen. Denken Sie aber daran, dass er nach 30 Sekunden standardmäßig abläuft. Wenn Sie möchten, dass es länger gehalten wird, müssen Sie die Timeout-Option zu add()/set()
method hinzufügen.
Wenn Sie für Ihre gesamte Site cachen möchten (zB Decorators, wie Sie sie benutzt haben), müssen Sie Ihrer MIDDLEWARE_CLASSES
in settings.py die richtige Middleware hinzufügen (in dieser Reihenfolge, weil die Middleware-Reihenfolge zählt) wird nacheinander geladen, wenn Sie sie definieren):
Wenn Sie sie nicht haben, erhalten Sie jedes Mal, wenn Sie Caching-pro-Site-Funktionen verwenden, fehlerhafte Header-Fehler.
In Ihrem Beispiel ist nicht klar, warum die Abmeldung fehlschlagen würde, aber es sollte nichts mit dem Zwischenspeichern eines Modells zu tun haben (es sei denn, Sie kopieren das Benutzermodell und verwenden den zwischengespeicherten Benutzer für die Authentifizierung anstelle von request.user? )
Es ist in Ordnung, cache.get und cache.set so zu verwenden, wie Sie sind (set erstellt einen neuen Schlüssel, falls er nicht existiert).
Das Zwischenspeichern von Abfragen kann schwierig sein, da Sie beim Ändern der Daten darauf achten müssen, dass der Cache ungültig wird, damit keine veralteten Ergebnisse angezeigt werden.
Werfen Sie einen Blick auf diese Bibliotheken zum Ablegen von Abfragen für Django, die die Dinge vereinfachen sollen: