5

セッションエンジンとしてDjangoとRedisを使用しています(Celeryも使用していますが、それは別のものです)。それは完全に機能し、速度の向上が見られます。

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

いくつかの方法でアクティブなユーザーをチェックするために毎分実行されるスクリプトがあり、ユーザーが最新の 1 分間アクティブでない場合、セッションは削除されます。これは、顧客の追跡ニーズのために行われます。

セッション エンジンとして Redis に切り替えるまで、このスクリプトは完全に機能していました。セッションは実際に DB から削除されますが、Redis からは削除されません。これには Django の組み込みメソッドは使用していませんが、独自の関数を使用しています。

def clean_sessions():
    stored_sessions = Session.objects.all()
    active_users = active_users(minutes=1)
    active_users_ids = [user.id for user in active_users]
    for session in stored_sessions:
        session_uid = session.get_decoded().get('_auth_user_id')
        if not session_uid:
            session.delete()
            continue
        if session_uid not in active_users_ids:
            user = User.objects.get(pk=session_uid)
            ## some code between ##
            session.delete()

私の質問は、ユーザーが実際にログアウトされるように、キャッシュからセッションを削除するにはどうすればよいですか?

4

2 に答える 2

2

あまり簡単ではありませんでしたが、修正することができました。私は私のclean_sessions()を持っているファイルからこれをインポートしました:

from importlib import import_module
from django.conf import settings

次に、関数内に SessionStore オブジェクトをロードしました。

SessionStore = import_module(settings.SESSION_ENGINE).SessionStore

そこから、メソッドを次のように残して、セッションを削除するのは非常に簡単でした。

def clean_sessions():
    stored_sessions = Session.objects.all()
    active_users = Request.objects.active_users(seconds=15)
    active_users_ids = [user.id for user in active_users]
    for session in stored_sessions:
        SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
        s = SessionStore(session_key=session.session_key)
        session_uid = session.get_decoded().get('_auth_user_id')
        if not session_uid:
            s.delete()
            continue
        if session_uid not in active_users_ids:
            ## some code ##
            s.delete()

使用しているセッション エンジンから適切な SessionStore をロードすることは非常に重要です。そうしないと、両方の場所 (DB とキャッシュ) からの削除に失敗します。

于 2014-08-19T08:02:33.563 に答える