2012-02-13 10 views
8

'un davranışını birleştirmenin bir yolu var Güvenlik nedenlerinden dolayı SESSION_EXPIRE_AT_BROWSER_CLOSE değerini true olarak ayarlıyorum.SESSION_EXPIRE_AT_BROWSER_CLOSE ve SESSION_COOKIE_AGE

Fakat, tarayıcı uzunlukta çerezleri (kullanıcı kendi tarayıcısını kapattığında en kısa sürede sona çerezler) bir sona zamanım yok, o zaman SESSION_COOKIE_AGE (Evet, bunu kontrol edin) hiçbir etkisi yoktur. Ancak, oturum kapatma/kapama sırasında çıkış yapmak için oturum kapatma/zaman aşımı ayarlamak istiyorum.

Soruma bakın, Tarayıcı uzunluklu çerezler senaryosunda eylemsizlik zaman aşımı/oturumu kapatmanın en iyi yolu nedir?

cevap

16

Açıkladığınız gibi, SESSION_EXPIRE_AT_BROWSER_CLOSE ve SESSION_COOKIE_AGE uyumlu değil. Bir çerez için bir son kullanma tarihi ayarladığınızda, bu çerez tarayıcı boyu çerez olmaz.

Ardından, istenilen davranışı elde etmek için, size set SESSION_EXPIRE_AT_BROWSER_CLOSE olarak Doğru ve kontrol elle tarafından zaman aşımı süresi olmalıdır.

elle kontrol etmek şık bir yolu zaman aşımı süresi dolacak:

  1. zaman aşımını kontrol yeni custom middleware oluşturun.
  2. Özel katman yazılımınızı (ve oturumlarınızı) etkinleştirmek için settings.py dosyasını değiştirin.

    class timeOutMiddleware(object): 
    
        def process_request(self, request): 
         if request.user.is_authenticated(): 
          if 'lastRequest' in request.session:    
           elapsedTime = datetime.datetime.now() - \ 
               request.session['lastRequest'] 
           if elapsedTime.seconds > 15*60: 
            del request.session['lastRequest'] 
            logout(request) 
    
          request.session['lastRequest'] = datetime.datetime.now() 
         else: 
          if 'lastRequest' in request.session: 
           del request.session['lastRequest'] 
    
         return None 
    

    lastRequest depolamak amacıyla sessions etkinleştirmek Unutmayın:

zaman aşımı özel katman kutu gibi görünüyor.

Bu çözüm yazılmıştır ve test edilmiş benim ve şimdi sitemde çalışıyor.) ... django 1.6 (Yeni

... iki yıl sonra)

Tarih saat ve PickleSerializer kullanıyorsanız timedelta değerleri sadece seri hale getirilebilir; Bu kod GNU lisansına sahiptir. Değilse, belki de kolay bir çözüm, translate datetime to unix timestamp and back. Bu çevirinin altına yazı yazabilirsiniz.

Düzenlendi

django-session-security uygulama etkin doğrulanmış kullanıcılara çıkış için bir mekanizma sağlar. Bir göz at.

+0

Büyüleyici gibi! Teşekkürler! – laffuste

+0

Que hace un maño en HK? – danihp

+0

Empece a viajar y no quise volver;) para como han dejado el pais politicos y banqueros ... – laffuste