Django uygulamamız aşağıdaki oturum yönetimi gereksinimlerine sahiptir.
- Kullanıcı tarayıcıyı kapattığında oturumların süresi dolar.
- Oturumlar, bir süre hareketsiz kaldıktan sonra sona erer.
- Etkinlik olmaması nedeniyle bir oturumun ne zaman sona erdiğini tespit edin ve kullanıcıya uygun mesajı görüntüleyin.
- Kullanıcıları, eylemsizlik süresinin bitiminden birkaç dakika önce sona ermesi konusunda uyarın. Uyarının yanı sıra, kullanıcılara oturumlarını uzatma seçeneği sunun.
- Kullanıcı, uygulama içinde sunucuya gönderilen istekleri içermeyen uzun bir iş etkinliği üzerinde çalışıyorsa, oturum zaman aşımına uğramamalıdır.
Belgeleri, Django kodunu ve bununla ilgili bazı blog yazılarını okuduktan sonra, aşağıdaki uygulama yaklaşımını buldum.
Gereksinim 1
Bu gereksinim, SESSION_EXPIRE_AT_BROWSER_CLOSE'u True olarak ayarlayarak kolayca uygulanabilir.
Gereksinim 2
Oturumun sona erme süresini ayarlamak için SESSION_COOKIE_AGE kullanmak için birkaç öneri gördüm. Ancak bu yöntemin aşağıdaki sorunları vardır.
Kullanıcı uygulamayı aktif olarak kullanıyor olsa bile, oturum her zaman SESSION_COOKIE_AGE sonunda sona erer. (Bu, özel bir ara yazılım kullanarak her istekte oturumun sona ermesini SESSION_COOKIE_AGE olarak ayarlayarak veya SESSION_SAVE_EVERY_REQUEST'i true olarak ayarlayarak oturumu her istekte kaydederek önlenebilir. Ancak SESSION_COOKIE_AGE kullanımı nedeniyle bir sonraki sorun kaçınılmazdır.)
Çerezlerin çalışma şekli nedeniyle, SESSION_EXPIRE_AT_BROWSER_CLOSE ve SESSION_COOKIE_AGE birbirini dışlar, yani çerez ya tarayıcı kapandığında ya da belirtilen süre sonunda sona erer. SESSION_COOKIE_AGE kullanılırsa ve kullanıcı, çerezin süresi dolmadan tarayıcıyı kapatırsa, çerez saklanır ve tarayıcının yeniden açılması, kullanıcının (veya başka birinin) yeniden kimlik doğrulaması yapılmadan sisteme girmesine izin verir.
Django, oturumun aktif olup olmadığını belirlemek için yalnızca mevcut tanımlama bilgisine güvenir. Seansla kaydedilen seans bitiş tarihini kontrol etmez.
Bu gereksinimi uygulamak ve yukarıda bahsedilen sorunları çözmek için aşağıdaki yöntem kullanılabilir.
- SESSION_COOKIE_AGE ayarlamayın.
- Her talepte oturumun sona erme tarihini 'geçerli zaman + hareketsizlik süresi' olarak ayarlayın.
- SessionMiddleware'de process_request'i geçersiz kılın ve oturumun sona ermesini kontrol edin. Süresi dolmuşsa oturumu iptal edin.
Gereksinim 3
Oturumun sona erdiğini tespit ettiğimizde (yukarıdaki özel SessionMiddleware'de), oturumun sona erdiğini belirtmek için istek üzerine bir öznitelik ayarlayın. Bu özellik, kullanıcıya uygun bir mesaj görüntülemek için kullanılabilir.
Gereksinim 4
Kullanıcının hareketsizliğini algılamak, uyarı sağlamak ve ayrıca oturumu uzatmak için bir seçenek sağlamak için JavaScript kullanın. Kullanıcı uzatmak isterse, oturumu uzatmak için sunucuya canlı tutma darbesi gönderin.
Gereksinim 5
Kullanıcı etkinliğini algılamak için JavaScript kullanın (uzun iş operasyonu sırasında) ve oturumun süresinin dolmasını önlemek için sunucuya canlı tutma darbeleri gönderin.
Yukarıdaki uygulama yaklaşımı çok ayrıntılı görünüyor ve daha basit bir yöntem olup olmadığını merak ediyordum (özellikle Gereksinim 2 için).
Herhangi bir anlayış çok takdir edilecektir.