gpt4 book ai didi

django - 从 Redis (Django) 中删除 session

转载 作者:IT王子 更新时间:2023-10-29 06:02:01 25 4
gpt4 key购买 nike

我使用 Django 和 Redis 作为 session 引擎(还有 Celery,但那是另外一回事)。它工作得很好,我可以看到速度有所提高。

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

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

在我切换到 Redis 作为 session 引擎之前,该脚本一直运行良好。 session 确实从数据库中删除,但没有从 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()

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

最佳答案

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

from importlib import import_module
from django.conf import settings

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

SessionStore = import_module(settings.SESSION_ENGINE).SessionStore

从那里,删除 session 非常容易,留下这样的方法:

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()

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

关于django - 从 Redis (Django) 中删除 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25377019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com