63

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

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)、上のビューに追加しました。しかし、セッションが期限切れになることはありません。私は何を間違っていますか?

4

10 に答える 10

69

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

SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_COOKIE_AGE = 5 * 60 #

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

于 2013-02-12T10:55:40.507 に答える
23

ジャンゴ1.9

settings.pyを編集し、以下を追加します。

# SESSION AGE 5 Minutes
SESSION_COOKIE_AGE = 5*60
于 2016-05-31T15:37:56.837 に答える
18

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

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

また、ユーザーがブラウザーの開いたページに機密データを残したままワークステーションを離れた場合、セキュリティ上の問題が発生する可能性があります。

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

これらの事項を考慮すると、django-session-securityが役立つ場合があります。

于 2013-02-12T10:57:43.783 に答える
5

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

...
request.session.set_expiry(300)
login(request, user)
...     
于 2014-11-21T13:06:37.410 に答える
3

これは私のために働く

設定.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

ミドルウェア.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
于 2015-11-11T22:09:43.820 に答える
1

5 分後の単純な有効期限を探していて、ユーザーへのプロンプトやセッションの延長を気にしない場合は、django-session-timeout がうまく機能します。

pip install django-session-timeout
SESSION_EXPIRE_SECONDS = 300  # 5 min
SESSION_EXPIRE_AFTER_LAST_ACTIVITY = True
SESSION_TIMEOUT_REDIRECT = '/accounts/logout/'  # redirect to whatever page

これは、指定されたページへのリダイレクト (ログアウト) を使用して、5 分後にセッションが期限切れになった場合の簡単な修正ですが、ユーザーへの警告やセッションを延長する機会の提供に関するこの投稿で取り上げられている他の問題のいくつかには役立ちません。最後のアクティビティ設定が True に設定されている場合、アクティビティに基づいてセッションを延長し続けますが、5 分以上かかるページを読んだり、フォームに記入したりすると、ログアウトされ、問題が発生する可能性があります。ユーザーはサイトの機能に応じて異なります。

詳細なドキュメントはこちら: https://pypi.org/project/django-session-timeout/

まだ実装していませんが、次の予定です。ユーザーにプロンプ​​トを表示し、セッションを延長するオプションを許可する機能を追加する必要がある場合は、他の投稿で django-session-security を推奨しています。

これらは、独自のミドルウェアを追加しない場合の良い代替手段です。

于 2020-07-30T00:32:39.627 に答える