2013-04-17 9 views
8

Io uso auth django per il mio sito Web, che deve avere installato il middleware di sessione.Disabilita cookie utente anonimo con Django

Il middleware di sessione Django aggiunge sempre un cookie di sessione, anche per utenti anonimi (utenti che non sono autenticati). Quando eseguono l'autenticazione, il cookie viene sostituito da un altro che indica che l'utente ha effettuato l'accesso.

Desidero disabilitare il cookie utente anonimo per scopi di memorizzazione nella cache (vernice).

C'è un modo per disabilitare i cookie utente anonimo senza rimuovere il middleware di sessione che è necessario per le app che usano auth?

+0

La sessione non viene creata se non si accede o non si modifica nel codice. – sbaechler

risposta

7

I dati di sessione sono impostati nel cookie nello process_response di SessionMiddleware. Questa funzione non utilizza alcuna impostazione o request.user, quindi non si ha alcun modo di sapere all'interno di questo metodo se l'utente è un utente registrato o un utente anonimo. Pertanto, non è possibile disabilitare l'invio del cookie di sessione al browser.

Tuttavia, se si desidera questa funzionalità, è possibile creare sottoclasse SessionMiddleware e oltre process_response.

from django.contrib.sessions.middleware import SessionMiddleware 
from django.conf import settings 

class NewSessionMiddleware(SessionMiddleware): 

    def process_response(self, request, response): 
     response = super(NewSessionMiddleware, self).process_response(request, response) 
     #You have access to request.user in this method 
     if not request.user.is_authenticated(): 
      del response.cookies[settings.SESSION_COOKIE_NAME] 
     return response 

E è possibile utilizzare il NewSessionMiddleware al posto di SessionMiddleware.

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'myapp.middleware.NewSessionMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.middleware.doc.XViewMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
) 
+0

Ho pensato alla sottoclasse ma request.user.is_authenticated() ha colpito il db per questo tipo di controllo? Se sì, questo significa che colpirà il DB ogni volta che viene caricata una pagina? – kollo

+0

No 'is_authenticated()' non ha colpito il db. Il popolamento di 'request.user' colpisce il db e viene eseguito da AuthenticationMiddleware. Ma questo comunque vuoi succedere su tutte le richieste. Ma 'is_authenticated' restituisce solo True o False a seconda dell'utente, per essere specifico se' request.user' è un'istanza di 'User', restituirà True e se' request.user' è un'istanza di 'AnonymousUser'. , restituirà False. Ma non colpirà il db. –

+0

Ok, grazie, scriverò questo;) – kollo

Problemi correlati