SORU
11 HAZİRAN 2010, Cuma


Nasıl Django hareketsizlik nedeniyle oturumu sona erecek?

Django bizim uygulama aşağıdaki oturum yönetimi gereksinimleri vardır.

  1. Oturumlar kullanıcı tarayıcıyı kapattığında sona erer.
  2. Seans hareketsizlik bir süre sonra sona erecek.
  3. Bir oturum sona erdiğinde hareketsizlik nedeniyle tespit ve kullanıcıya uygun iletisi görüntüler.
  4. Yaklaşan bir oturum kullanıcıları eylemsizlik dönemi sona ermeden önce birkaç dakika bitiş uyar. Bu uyarı ile birlikte, kullanıcıların oturum uzatmak için bir seçenek sağlar.
  5. Eğer kullanıcı sunucuya istek gönderiliyor içermeyen uygulama içinde uzun bir iş aktivitesi üzerinde çalışıyorsa, oturum zaman aşımı olmamalıdır.

Belgelere, Django kod ve blog yazıları bu ile ilgili okuduktan sonra, aşağıdaki uygulama yaklaşımı ile geldi.

Gereksinimi 1
Bu gereksinim, kolayca Doğru SESSİON_EXPİRE_AT_BROWSER_CLOSE ayarlayarak uygulanır.

Gereksinimi 2
Bazı öneriler SESSİON_COOKİE_AGE aşımı süresi oturumu ayarlamak için kullanmak gördüm. Ancak bu yöntem, aşağıdaki sorunları var.

  • Oturum her zaman eğer kullanıcı aktif olarak uygulamayı kullanıyorsa bile SESSİON_COOKİE_AGE sonunda sona eriyor. (Bu doğru SESSİON_SAVE_EVERY_REQUEST ayarlayarak her istek üzerine oturum kaydederek son oturum her isteği özel bir katman kullanarak SESSİON_COOKİE_AGE ayarlayarak ya da önlenebilir. Ama bir sonraki sorun SESSİON_COOKİE_AGE. kullanılması nedeniyle bu kaçınılmazdır)

  • Yol nedeniyle kurabiye iş, SESSİON_EXPİRE_AT_BROWSER_CLOSE ve SESSİON_COOKİE_AGE belirtilen süre sonunda tarayıcıyı kapatmak ya sona erecek ya da Çerez yani birbirini dışlayan. Eğer SESSİON_COOKİE_AGE kullanılır ve kullanıcı kapanmadan önce tarayıcı tanımlama bilgisi süresi, çerez tutulur ve yeniden açmayı tarayıcı sağlayacak kullanıcı (veya başka biri) sistemi olmadan yeniden doğrulanmış.

  • Django sadece çerez varsa oturum etkin olup olmadığını belirlemek için kullanır. Oturum bitiş tarihi oturumu ile depolanan kontrol etmez.

Aşağıdaki yöntemi bu gereksinimi uygulanan ve yukarıda belirtilen sorunların çözümü için kullanılabilir.

  • SESSİON_COOKİE_AGE ayarlamayın.
  • 'Etkinlik dönemi şimdiki zaman' her istek üzerine. oturumun bitiş tarihi ayarlayın
  • SessionMiddleware içinde process_request geçersiz kılar ve oturum zaman aşımı için kontrol edin. Eğer süresi dolmuşsa oturum atın.

Gereksinimi 3
Oturum süresi doldu (özel SessionMiddleware yukarıda) olduğunu tespit ettiğimiz zaman, bu istek üzerine bir öznitelik oturum zaman aşımı belirtmek için ayarlayın. Bu öznitelik, kullanıcı için uygun bir ileti görüntülemek için kullanılabilir.

Gereksinimi 4
JavaScript kullanıcı etkinlik tespit, uyarı ve oturum uzatma opsiyonu da sağlamak için kullanın. Eğer kullanıcı uzatmak istiyorsa, bir sunucuya hayatta darbe oturum genişletmeye devam gönder.

Gereksinimi 5
JavaScript kullanıcı etkinliği (uzun iş işlemi sırasında) tespit ve sunucuya canlı bakliyat oturum zaman aşımına uğramasını engellemek için göndermek için kullanın.


Yukarıdaki uygulama yaklaşımı çok ayrıntılı görünüyor ve eğer varsa orada daha basit bir yöntem (özellikle Gereksinimi 2) merak ediyordum.

Herhangi bir anlayış son derece takdir edilecektir.

CEVAP
11 HAZİRAN 2010, Cuma


İşte bir fikir, tarayıcı üzerinde oturum SESSION_EXPIRE_AT_BROWSER_CLOSE ayar ile yakın Sona erer. Sonra her istek üzerine oturum bir zaman damgası gibi ayarlayın.

request.session['last_activity'] = datetime.now()

ve eğer oturum süresi dolmuş olup olmadığını tespit etmek için bir katman ekleyin. böyle bir şey tüm süreci ele

from datetime import datetime
from django.http import HttpResponseRedirect

class SessionExpiredMiddleware:
    def process_request(request):
        last_activity = request.session['last_activity']
        now = datetime.now()

        if (now - last_activity).minutes > 10:
            # Do logout / expire session
            # and then...
            return HttpResponseRedirect("LOGIN_PAGE_URL")

        if not request.is_ajax():
            # don't set this for ajax requests or else your
            # expired session checks will keep the session from
            # expiring :)
            request.session['last_activity'] = now

O zaman sadece bazı adresler ve görüşlerini ajax çağrıları seansın bitiminden ilgili ilgili verileri geri dönmek için yapmak zorunda.

kullanıcı "" oturumu, tabiri caizse, sizin için geçerli zaman requeset.session['last_activity'] tekrar ayarlayın . yenilemek için seçmesi

Açıkçası bu kod, yalnızca bir başlangıç... ama doğru yolda almalısınız

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • akalyne

    akalyne

    13 Mayıs 2009
  • Howcast

    Howcast

    4 EKİM 2007
  • Jordie Jordan

    Jordie Jorda

    27 Ocak 2008