2009-07-07 4 views
12

vor allem: das ist nicht das gleiche wie this. Das ModelBackend hat kein Mitglied request.Zugriff request.session von backend.get_user

Ich möchte auf die Sitzung des aktuellen Benutzers ohne Zugriff auf das globale Anfrageobjekt oder seine Sitzungs-ID zugreifen.

Warum? Ich habe mein eigenes Authentifizierungs-Backend geschrieben, das ModelBackend erweitert. Darin habe ich die Funktion get_user (self, user_id), die bei jeder Anfrage aufgerufen wird (dies geschieht automatisch durch die Django-Auth-Middleware). Leider get_user hat keinen Zugriff auf request, aber nichtsdestotrotz in meinem Fall möchte ich mit Daten in der Sitzung überprüfen (Warum wieder? Weil ich keine lokale Datenbank habe und alle Daten von einer Remote-Middleware. Die Sitzung würde eine bequeme Möglichkeit, eine Art Caching durchzuführen).

Antwort

4

Die RemoteUserBackend (von django.contrib.auth.backends) verwendet spezielle Middleware, RemoteUserMiddleware, um auf Anforderungsdaten zuzugreifen. Vielleicht könntest du es auch so machen.

+0

Sorry, ich weiß, dass dies ein alter Thread ist, aber ich schaue mir den referenzierten Code an und sehe nicht, wo er auf die Anfragedaten für den gerade authentifizierten Benutzer zugreift. – ThatAintWorking

+2

@RonSmith Ich habe die Links ein wenig aktualisiert. Der Trick ist, dass alles von 'RemoteUserMiddleware.process_request' gemacht wird - es wird ein' request' Objekt (middleware.py # L40) übergeben. Es prüft auf das Vorhandensein des 'Remote-User'-HTTP-Headers (L50) und gibt diese Daten dann an 'RemoteUserBackend.authenticate' (L73) weiter und speichert das Ergebnis in' request' (L77). In diesem Fall ist nur der Wert des HTTP-Headers passeb, aber die Idee war, dass wenn Sie Session-Informationen im Auth-Backend benötigen, Sie sie dort vorsorglich von einer Middleware aus speichern könnten. – drdaeman

+2

Stört es Sie, Ihre Antwort mit ein paar Zeilen Code als Beispiel zu aktualisieren? Vielen Dank. –

6

Sie können den winzigen ThreadLocalMiddleware verwenden. Es macht das Anfrageobjekt überall verfügbar.

from django_tools.middlewares import ThreadLocal 

request = ThreadLocal.get_current_request() 
# request.session <-- is now available 

Vergessen Sie nicht, die Middleware in die MIDDLEWARE_CLASSES Tupel Ihrer settings.py hinzuzufügen:

MIDDLEWARE_CLASSES = (
    ... 
    'django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware', 
    ... 
) 
+0

Leider ist es GPL V3 ... –

0

Sie auch einen ‚Antrag‘ Parameter an die authenticate Funktion jederzeit Sie es passieren kann anrufen

+0

Die Frage ist über get_user Funktion, keine Authentifizierung (..) – chaim

+0

Ich fand immer noch die Antwort nützlich, wie ich es während der Authentifizierung benötigt. – Jayen