web-dev-qa-db-ja.com

期限切れの方法Django 5分でセッション?

私はこれを使用してユーザーにログインしています:

_def login_backend(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user)
            request.session.set_expiry(300)
            return HttpResponseRedirect('/overview/')
        else:
            return HttpResponseRedirect('/login_backend/')
    else:
        return render_to_response('login_backend.html', context_instance=RequestContext(request))
_

5分後にセッションの有効期限が切れるようにしたいので、上記のビューにrequest.session.set_expiry(300)を追加しました。しかし、セッションが期限切れになることはありません。何が間違っていますか?

37
pynovice

Django 1.6の更新

以下のミドルウェアコードは、jsonがシリアライズ可能であるため、Django 1.6以降のバージョンでは動作しません。Djangoのすべてのバージョンで動作させるには、セッションシリアライザーを配置します。

settings.py

#Handle session is not Json Serializable
SESSION_SERIALIZER = 'Django.contrib.sessions.serializers.PickleSerializer'

上記のシリアライザーのサンプルは、Django 1.6向けです。他のバージョンを検索してください。ありがとう...

作成middleware.py

from datetime import datetime, timedelta
from Django.conf import settings
from Django.contrib import auth


class AutoLogout:
  def process_request(self, request):
    if not request.user.is_authenticated() :
      #Can't log out if not logged in
      return

    try:
      if datetime.now() - request.session['last_touch'] > timedelta( 0, settings.AUTO_LOGOUT_DELAY * 60, 0):
        auth.logout(request)
        del request.session['last_touch']
        return
    except KeyError:
      pass

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

settings.pyを更新します:

MIDDLEWARE_CLASSES = [
    .........................

    'app_name.middleware.AutoLogout', 
]

# Auto logout delay in minutes
AUTO_LOGOUT_DELAY = 5 #equivalent to 5 minutes
34
catherine

セッションを期限切れにする2つのパラメーター、 SESSION_EXPIRE_AT_BROWSER_CLOSESESSION_COOKIE_AGE があります。 5分で期限切れにする場合は、次のように設定する必要があります。

SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_COOKIE_AGE = 5 * 60 #

両方を組み合わせるには、カスタムミドルウェアの作成方法を学びます "SESSION_EXPIRE_AT_BROWSER_CLOSEとSESSION_COOKIE_AGEの動作を組み合わせる方法はありますか?

43
dani herrera

Django 1.9

settings.pyを編集して、次を追加します。

# SESSION AGE 5 Minutes
SESSION_COOKIE_AGE = 5*60
14
Slipstream

プロジェクトによっては、これでは不十分な場合があります。

たとえば、ユーザーがフォームの入力に6分を費やし、「保存」をクリックした場合はどうなりますか?ブラウザはログインページにリダイレクトされ、フォームデータは失われます。

また、ユーザーがブラウザの開かれたページに機密データを残してワークステーションを離れる場合、潜在的なセキュリティ問題があります。

また、ユーザーが6分間ページを読んだ場合はどうなりますか?その場合、警告なしに、またはセッションを延長する方法なしにログアウトするのは本当にクールではありません...

これらの問題を考慮すると、 Django-session-security が便利だと思うかもしれません。

13
jpic

Login()を呼び出す前に必要なセッション時間を設定してください!

...
request.session.set_expiry(300)
login(request, user)
...     
2
Dmitry Nikitin

これは私のために働く

settings.py

TIME= 240*60  //four hours  or your time
SESSION_SERIALIZER = 'Django.contrib.sessions.serializers.PickleSerializer'
SESSION_EXPIRE_AT_BROWSER_CLOSE= True
SESSION_COOKIE_AGE = TIME    //change expired session
SESSION_IDLE_TIMEOUT = TIME  //logout

middleware.py

from Django.contrib.auth import logout
from Django.contrib import messages
import datetime
from Django.shortcuts import redirect

import settings

class SessionIdleTimeout:
    def process_request(self, request):
        if request.user.is_authenticated():
            current_datetime = datetime.datetime.now()
            if ('last_login' in request.session):
                last = (current_datetime - request.session['last_login']).seconds
                if last > settings.SESSION_IDLE_TIMEOUT:
                    logout(request, login.html)
            else:
                request.session['last_login'] = current_datetime
        return None
2
jhonny lopez

私はDjango 2.1.7を使用し、有効期限を切れる最も簡単な方法はDjangoセッションです:

  • まず、次のコマンドでDjango-session-timeoutをインストールする必要があります。

    pip install Django-session-timeout

  • settings.pyでSessionTimeoutMiddlewareを更新する必要があるよりも

    MIDDLEWARE_CLASSES = [ ... 'Django.contrib.sessions.middleware.SessionMiddleware', 'Django_session_timeout.middleware.SessionTimeoutMiddleware', ... ]

  • 最後に、settings.pyの最後にSESSION_EXPIRE_SECONDSを追加する必要があります。

    SESSION_EXPIRE_SECONDS = 300 # 300 seconds = 5 minutes

デフォルトでは、セッションはセッション開始後X秒で期限切れになります。最後のアクティビティからX秒後にセッションを期限切れにするには、次の設定を使用します。

SESSION_EXPIRE_AFTER_LAST_ACTIVITY = True

2
Mihael Waschl