私はこれを使用してユーザーにログインしています:
_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)
を追加しました。しかし、セッションが期限切れになることはありません。何が間違っていますか?
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
セッションを期限切れにする2つのパラメーター、 SESSION_EXPIRE_AT_BROWSER_CLOSE と SESSION_COOKIE_AGE があります。 5分で期限切れにする場合は、次のように設定する必要があります。
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_COOKIE_AGE = 5 * 60 #
両方を組み合わせるには、カスタムミドルウェアの作成方法を学びます "SESSION_EXPIRE_AT_BROWSER_CLOSEとSESSION_COOKIE_AGEの動作を組み合わせる方法はありますか?
Django 1.9
settings.pyを編集して、次を追加します。
# SESSION AGE 5 Minutes
SESSION_COOKIE_AGE = 5*60
プロジェクトによっては、これでは不十分な場合があります。
たとえば、ユーザーがフォームの入力に6分を費やし、「保存」をクリックした場合はどうなりますか?ブラウザはログインページにリダイレクトされ、フォームデータは失われます。
また、ユーザーがブラウザの開かれたページに機密データを残してワークステーションを離れる場合、潜在的なセキュリティ問題があります。
また、ユーザーが6分間ページを読んだ場合はどうなりますか?その場合、警告なしに、またはセッションを延長する方法なしにログアウトするのは本当にクールではありません...
これらの問題を考慮すると、 Django-session-security が便利だと思うかもしれません。
Login()を呼び出す前に必要なセッション時間を設定してください!
...
request.session.set_expiry(300)
login(request, user)
...
これは私のために働く
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
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
私は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