2009-09-02 17 views
12

Z dokumentacji Django, stałem pod wrażeniem, że wywołanie:Ważność sesji Django?

request.session.set_expiry(300) 

z jednym widoku spowoduje, że sesja wygasa po pięciu minutach bezczynności; Jednak nie jest to zachowanie, które występują w bagażniku django. Jeśli wywołasz tę metodę z jednego widoku i przejdę do innych widoków, które nie wywołują metody, sesja wygasa za pięć minut. Zachowanie, którego oczekiwałem, wygaśnie dopiero po pięciu minutach bezczynności, a nie po prostu nie zadzwonię ponownie do set_expiry przed wygaśnięciem.

Moje pytanie brzmi: czy naprawdę muszę wywołać funkcję set_expiry w każdym widoku? Jeśli tak, czy istnieje jakiś dekorator, który może być pomocny? Nie mogę sobie wyobrazić, że to nie jest część contrib.

Dzięki Pete

Odpowiedz

26

Jako autor tych metod, widzę, że dokumentacja nie jest jasne, w odniesieniu do tego. Twoje obserwacje są poprawne: tylko żądania powodujące zmianę sesji są uważane za "aktywność".

Możesz użyć ustawienia SESSION_SAVE_EVERY_REQUEST, aby uzyskać pożądane zachowanie (przy oczywistych kosztach sesji, które muszą zostać zapisane dla każdego żądania).

+0

Dzięki Chris, udało się. Informacje, które właśnie podałeś, powinny być zawarte w dokumentach. – slypete

+1

Uzgodnione. Chcesz otworzyć bilet? ;) – SmileyChris

3

Proste oprogramowanie pośrednie prawdopodobnie lepiej by było, niż ustawienie tego w każdym widoku. Właśnie tego użyłem.

class SessionExpiry(object): 
    """ Set the session expiry according to settings """ 
    def process_request(self, request): 
     if getattr(settings, 'SESSION_EXPIRY', None): 
      request.session.set_expiry(settings.SESSION_EXPIRY) 
     return None 

To zależy od ustawienia SESSION_EXPIRY w konfiguracji. Jego format jest taki sam jak request.session.set_expiry.

MIDDLEWARE_CLASSES powinny być zdefiniowane z tego celu na uwadze:

MIDDLEWARE_CLASSES = (
    ... 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    '<yourproject>.<yourapp>.middleware.SessionExpiry', 
    ... 
} 

Byłoby miło, gdyby django.contrib.sessions wziął pod uwagę to ustawienie domyślne.

+0

Czy tęskniłeś za odpowiedzią SmileyChris? 'SESSION_SAVE_EVERY_REQUEST' robi dokładnie to bez żadnego niestandardowego oprogramowania pośredniego. – slypete

+1

Tak, ale tylko wywołanie set_expiry wywoływane w jednym widoku wymaga, aby wszyscy użytkownicy kliknęli w ten widok, który określa datę wygaśnięcia. Jest mało prawdopodobne, że użytkownicy przejdą przez ten widok. Za pomocą oprogramowania pośredniego można wyodrębnić ten zestaw wygasania poza widokiem. Jeśli jego odpowiedź działa dla ciebie, fajnie. Po prostu pomyślałem, że to może być czystszy sposób robienia tego i to jest sposób, w jaki zdecydowałem się na to. –

+0

Myślę, że źle zrozumiałeś odpowiedź. 'SESSION_SAVE_EVERY_REQUEST' robi dokładnie to, co robisz bez żadnego widoku określonego kodu. Po prostu wskazuję, że wymyśliłeś nowe koło. – slypete

Powiązane problemy