2013-04-17 11 views
8

Używam django auth dla mojej witryny, która musi mieć zainstalowane oprogramowanie pośrednie sesji.Wyłączanie anonimowego cookie użytkownika z Django

Oprogramowanie pośredniczące sesji Django zawsze dodaje plik cookie sesji, nawet dla anonimowych użytkowników (użytkowników, którzy nie są uwierzytelnieni). Po uwierzytelnieniu plik cookie zostaje zastąpiony innym, informującym, że użytkownik jest zalogowany.

Chcę wyłączyć anonimowy plik cookie użytkownika do celów buforowania (lakier).

Czy istnieje sposób wyłączenia anonimowych plików cookie użytkownika bez usuwania oprogramowania pośredniego sesji, które jest niezbędne dla aplikacji używających auth?

+0

Sesja nie jest tworzona, jeśli nie masz dostępu lub nie modyfikujesz jej w kodzie. – sbaechler

Odpowiedz

7

Dane sesji ustawiane są w pliku cookie w pliku process_response z SessionMiddleware. Ta funkcja nie używa żadnego ustawienia ani request.user, więc nie masz możliwości poznania w tej metodzie, czy użytkownik jest zalogowanym użytkownikiem, czy anonimowym użytkownikiem. Nie można wyłączyć wysyłania pliku cookie sesji do przeglądarki.

Jednak jeśli chcesz korzystać z tej funkcji, możesz podklasę SessionMiddleware i overide 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 

I można używać NewSessionMiddleware zamiast 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

Myślałem o podklasy, ale jest request.user.is_authenticated() hit db dla tego rodzaju wyboru? Jeśli tak to oznacza, że ​​uderzy DB za każdym razem, gdy strona jest ładowana? – kollo

+0

Nie 'is_authenticated()' nie trafia do bazy danych. Wypełnianie 'request.user' trafia do db i odbywa się przez AuthenticationMiddleware. Ale tak czy inaczej chcesz się zdarzyć na wszystkie prośby. Ale 'is_authenticated' zwraca tylko True lub False w zależności od użytkownika, aby być specyficznym, jeśli' request.user' jest instancją 'User', zwróci True i jeśli' request.user' jest instancją 'AnonymousUser' zwróci False. Ale nie trafi w db. –

+0

OK, dzięki, zagłębię się w to;) – kollo

Powiązane problemy