2009-07-07 12 views
12

prima di tutto: questo è non uguale a this. ModelBackend non ha alcun membro request.Access request.session da backend.get_user

Desidero accedere alla sessione dell'utente corrente senza accedere all'oggetto di richiesta globale o al suo ID di sessione.

Perché? Ho scritto il mio backend di autenticazione, estendendo ModelBackend. In questo ho la funzione get_user (self, user_id), che viene chiamata con ogni richiesta (questa operazione viene eseguita automaticamente dal middleware di Django auth). Purtroppo, get_user non ha accesso a request, ma nel mio caso voglio comunque controllare i dati nella sessione (perché ancora? Perché non ho un database locale e ottengo tutti i dati da un middleware remoto. essere un modo comodo per fare un qualche tipo di memorizzazione nella cache).

risposta

4

RemoteUserBackend (da django.contrib.auth.backends) utilizza middleware speciale, RemoteUserMiddleware, per accedere ai dati della richiesta. Forse potresti farlo anche in questo modo.

+0

dispiace, so che questo è un vecchio thread, ma sto guardando il codice di riferimento e non vedo dove sta accedendo ai dati di richiesta per l'utente ho appena autenticato. – ThatAintWorking

+2

@RonSmith Ho aggiornato i collegamenti un po '. Il trucco è che tutto è fatto da 'RemoteUserMiddleware.process_request' - viene passato un oggetto' request' (middleware.py # L40). Verifica la presenza dell'intestazione HTTP 'Remote-User' (L50) e in tal caso passa tali dati a' RemoteUserBackend.authenticate' (L73) e salva il risultato in 'request' (L77). In questo caso, solo il valore dell'intestazione HTTP è passeb, ma l'idea era che se hai bisogno di informazioni sulla sessione nel back-end auth, puoi memorizzarlo preventivamente da un middleware. – drdaeman

+2

Ti dispiace aggiornare la tua risposta con poche righe di codice come esempio? Grazie. –

6

È possibile utilizzare il minuscolo ThreadLocalMiddleware. Rende l'oggetto di richiesta ovunque disponibile.

from django_tools.middlewares import ThreadLocal 

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

Non dimenticate di aggiungere il middleware nella tupla MIDDLEWARE_CLASSES del vostro settings.py:

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

Sfortunatamente è GPL V3 ... –

0

È inoltre possibile passare un parametro 'richiesta' alla funzione authenticate qualsiasi momento si chiama:

def authenticate(self, request, **kwargs): 
    .... 
+0

La domanda riguarda la funzione get_user, nessuna autenticazione (..) – chaim

+0

Ho ancora trovato la risposta utile perché ne avevo bisogno durante l'autenticazione. – Jayen

Problemi correlati