Django: Gibt es eine Möglichkeit, die Anfrage für request.user bei jeder Anfrage zu vermeiden?

9

Für meine Website hat so ziemlich jede Seite eine Kopfzeile, die "Willkommen, ABC" anzeigt, wobei "ABC" der Benutzername ist. Das heißt, request.user wird für jede einzelne Anfrage aufgerufen, was immer wieder zu Datenbanktreffern führt.

Aber sobald ein Benutzer angemeldet ist, sollte ich in der Lage sein, seine user -Instanz in seinem Cookie zu speichern und zu verschlüsseln. Auf diese Weise kann ich vermeiden, wiederholt auf die Datenbank zu treffen und stattdessen request.user vom Cookie abzurufen.

Wie würdest du Django modifizieren, um dies zu tun? Gibt es irgendwelche Django-Plugins, die das machen, was ich brauche?

Danke

    
Continuation 10.05.2011, 23:10
quelle

4 Antworten

4

Sie möchten die Sitzungs-Middleware verwenden, und Sie sollten die Dokumentation . Die Session-Middleware unterstützt mehrere Session-Engines . Im Idealfall würden Sie Memcached oder Redis verwenden, aber könnten Sie Ihre eigene Session-Engine zum Speichern schreiben alle Daten im Cookie des Nutzers . Sobald Sie die Middleware aktivieren, ist sie als Teil des Anforderungsobjekts verfügbar. Du interagierst mit request.session , was sich wie ein Diktat verhält, was es einfach zu benutzen macht. Hier sind ein paar Beispiele aus der Dokumentation:

Diese vereinfachte Ansicht setzt eine has_commented-Variable auf True, nachdem ein Benutzer einen Kommentar gepostet hat. Ein Benutzer darf einen Kommentar nicht mehr als einmal posten:

%Vor%

Diese vereinfachte Ansicht meldet ein "Mitglied" der Site an:

%Vor%     
zeekay 11.05.2011, 01:38
quelle
5

Das riecht nach Überoptimierung. Einen Benutzer aus der Datenbank abzurufen, ist ein einzelner Treffer pro Anfrage oder möglicherweise zwei, wenn Sie auch ein Profilmodell verwenden. Wenn Ihre Website so aussieht, dass zwei zusätzliche Abfragen die Leistung erheblich verbessern, haben Sie möglicherweise größere Probleme.

    
Daniel Roseman 11.05.2011 07:16
quelle
1

Sobald Sie ein ordentliches Caching haben, sollte die Anzahl der Datenbanktreffer deutlich reduziert werden - dann bin ich nicht mehr wirklich Experte für Caching. Ich denke, es wäre eine schlechte Idee, request.user zu ändern, um Ihr Problem zu lösen. Ich denke, eine bessere Lösung wäre, ein Dienstprogramm, eine Methode oder ein benutzerdefiniertes Template-Tag zu erstellen, das versucht, die erforderlichen Benutzerdaten aus dem Cookie zu laden und das Ergebnis zurückzugeben. Wenn die Benutzerdaten nicht im Cookie gefunden werden, sollte ein Aufruf von request.user erfolgen, die Daten im Cookie speichern und das Ergebnis zurückgeben. Sie könnten möglicherweise ein post_save-Signal verwenden, um nach Änderungen an den Benutzerdaten zu suchen, damit Sie das Cookie nach Bedarf aktualisieren können.

    
solartic 11.05.2011 00:05
quelle
1

Der Benutzer ist mit der Authentifizierungs-Middleware von django (django.contrib.auth.middleware) an das Anforderungsobjekt gebunden. Es verwendet eine Funktion die Funktion get_user in django.contrib.auth. init , um den Benutzer aus dem Back-End zu erhalten, das Sie verwenden. Sie können diese Funktion leicht ändern, um nach dem Benutzer an einem anderen Ort (z. B. Cookie) zu suchen.

Wenn ein Benutzer angemeldet ist, setzt django die Benutzer-ID in die Sitzung (request.session [SESSION_KEY] = user.id). Wenn sich ein Benutzer abmeldet, löscht er die ID des Benutzers aus der Sitzung. Sie können diese Anmelde- und Abmeldefunktionen überschreiben, um auch ein Benutzerobjekt im Cookie / Lösch-Benutzerobjekt des Browsers vor einem Cookie im Browser zu speichern. Beide Funktionen sind auch in django.contrib.auth. init

Hier finden Sie Informationen zum Einstellen von Cookies: Django Cookies, wie kann ich sie einstellen?

    
systemizer 11.05.2011 02:12
quelle