2012-12-20 15 views
8

Mam aplikację Django, która rejestruje wybory produktów użytkowników dla obu uwierzytelnionych użytkowników. Moim zamiarem jest, aby użyć zmiennej request.session.session_key skojarzyć anonimowe dane z użytkownikiem, jeśli zdecydują się później zarejestrować, a la ten post:Klucz sesji django zmienia się po uwierzytelnieniu

Django storing anonymous user data

Wydaje się jednak, że sesja kluczowe zmiany, gdy użytkownik loguje się/registers, aby klucz sesji nie był już powiązany z użytkownikiem. Czy to jest poprawne zachowanie struktury sesji Django. Czy istnieje solidny sposób na osiągnięcie funkcjonalności, której szukam?

Każda pomoc bardzo ceniona.

+0

Spójrz na [Django sesji: Zmiana klucza sesji, kiedy zmodyfikowana] (http://stackoverflow.com/questions/ 11192904/django-sessions-changing-session-key-when-modified). –

+0

Należy pamiętać, że ta zmiana kluczy sesji pomaga w pewnym stopniu w ochronie przed fiksowaniem sesji. Rozważ to przed wyłączeniem. – Mark

Odpowiedz

10

W settings.py

SESSION_ENGINE = 'youapp.session_backend'

w youapp katalogów w pliku session_backend.py

from django.contrib.sessions.backends.db import SessionStore as DbSessionStore 

class SessionStore(DbSessionStore): 
    def cycle_key(self): 
     pass 

I sesji nie zmienił się po zalogowaniu

3

natomiast podejście sugerowane przez nnmware może działać w tym konkretnym przypadku, jest lepszy.

Zamiast po prostu nic nie robić wewnątrz cycle_key, powinniśmy wywołać metodę super, a następnie zapisać sesję.

Bo jeśli zajrzysz do oryginalnej funkcji cycle_key, zobaczysz, że dane ze starej sesji są kopiowane do nowej, ale nie są zapisane.

W settings.py

SESSION_ENGINE = 'yourapp.session_backend' 

Sprawdź, SESSION_ENGINE wskazuje na moduł (plik .py), ale nie do klasy backend!

Teraz, w swojej 'yourapp/session_backend.py' wykonaj następujące czynności:

from django.contrib.sessions.backends.db import SessionStore as DbSessionStore 

class SessionStore(DbSessionStore): 
    def cycle_key(self): 
     super(SessionStore, self).cycle_key() 
     self.save() 
Powiązane problemy