从 Redis (Django) 中删除会话

Bob*_*Dem 5 django session django-authentication redis django-redis

我使用 Django 和 Redis 作为会话引擎(也是 Celery,但那是别的东西)。它工作得很好,我可以看到速度的提高。

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
Run Code Online (Sandbox Code Playgroud)

我有一个脚本,每分钟运行一次,通过某些方法检查活动用户,如果用户在最近一分钟内没有活动,则会话将被删除。这样做是为了满足客户的跟踪需求。

在我切换到 Redis 作为会话引擎之前,此脚本运行良好。会话确实从数据库中删除,但不会从 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()
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何从缓存中删除会话,以便用户实际上已注销?

Bob*_*Dem 2

这不是很简单,但我能够解决它。我从 clean_sessions() 文件中导入了它:

from importlib import import_module
from django.conf import settings
Run Code Online (Sandbox Code Playgroud)

然后,在函数内部,我加载了 SessionStore 对象:

SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
Run Code Online (Sandbox Code Playgroud)

从那里,删除会话非常容易,方法如下:

SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
Run Code Online (Sandbox Code Playgroud)

从您使用的任何会话引擎加载正确的 SessionStore 非常重要,否则它将无法从两个位置(数据库和缓存)中删除它。