2013-04-17 5 views
8

Ich benutze Django Auth für meine Website, die die Sitzung Middleware installiert haben muss.Deaktivieren Sie anonyme Benutzer-Cookie mit Django

Django-Sitzung Middleware fügt immer einen Sitzungscookie hinzu, auch für anonyme Benutzer (Benutzer, die nicht authentifiziert sind). Bei der Authentifizierung wird der Cookie durch einen anderen ersetzt, der angibt, dass der Benutzer angemeldet ist.

Ich möchte den anonymen Benutzer-Cookie für Cache-Zwecke (Lack) deaktivieren.

Gibt es eine Möglichkeit, anonyme Benutzer-Cookies zu deaktivieren, ohne Session-Middleware zu entfernen, die für Apps mit Authentifizierung erforderlich ist?

+0

Die Sitzung wird nicht erstellt, wenn Sie nicht auf Ihren Code zugreifen oder ihn ändern. – sbaechler

Antwort

7

Sitzungsdaten werden im Cookie im process_response von SessionMiddleware festgelegt. Diese Funktion verwendet keine Einstellung oder request.user, so dass Sie innerhalb dieser Methode nicht wissen können, ob der Benutzer ein angemeldeter Benutzer oder ein anonymer Benutzer ist. Daher können Sie das Senden des Sitzungscookies an den Browser nicht deaktivieren.

Wenn Sie jedoch diese Funktionalität möchten, können Sie SessionMiddleware und process_response überlagern.

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 

Und Sie können Ihren NewSessionMiddleware anstelle von SessionMiddleware verwenden.

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

Ich dachte über Unterklassen, aber ist request.user.is_authenticated() die db für diese Art von Prüfung zu schlagen, wenn ja, das bedeutet, dass es die DB jedes Mal trifft, wenn eine Seite geladen wird? – kollo

+0

Nein 'is_authenticated()' trifft die Datenbank nicht. Das Auffüllen von 'request.user' trifft die db und es erfolgt durch AuthenticationMiddleware. Aber das möchtest du sowieso bei allen Anfragen machen. Aber 'is_authenticated' gibt nur entweder True oder False zurück, je nach Benutzer, um genau zu sein, wenn' request.user' eine Instanz von 'User' ist, wird True zurückgegeben und wenn' request.user' eine Instanz von 'AnonymousUser' ist , es wird False zurückgeben. Aber es wird nicht die db treffen. –

+0

Ok danke, ich werde das genauer betrachten;) – kollo