当前位置: 首页 > 面试题库 >

从Redis删除会话(Django)

鲜于岳
2023-03-14
问题内容

我正在使用Django和Redis作为会话引擎(也是Celery,但这是其他东西)。它运行完美,我可以看到速度有所提高。

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

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

在我切换到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()

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


问题答案:

它不是很简单,但是我能够解决它。我从我有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非常重要,否则它将无法从两个位置(数据库和缓存)中将其删除。



 类似资料:
  • 我的购物车有两个功能,第一个是退货总价和商品总数量: 这两个函数返回这两个参数: 和: 我可以通过此功能销毁所有购物车会话: 如何删除特定购物车项目?我在使用这个方法,它的工作。但它不会改变总价和总数量:

  • 在web.xml中,my的被设置为120(即2小时)。Hazelcast地图名为SessionMap,其TTL为24小时。这里的想法是,我们希望结束2小时不活动的会话,但如果有人持续使用应用程序,我们希望让会话继续最多24小时。 问题是,如果我让一个会话处于空闲状态,Tomcat将在2小时后终止会话,但会话仍将保留在Hazelcast映射(SessionMap)中,直到TTL。当会话在Tomcat

  • 因为我的用户已经将他们的会话配置为每次重新打开firefox浏览器时都重新打开。“会话”cookies回来了。但是,如果会话cookie不存在或存在24小时,我的网站需要新的身份验证。所以我遇到了这样一个问题:每次24小时后重新打开浏览器时,我都需要手动删除过期的cookies。 为了解决这个问题,我在我的页面上放了一个“注销”链接,这应该对我有所帮助。但不幸的是,这无助于。。。 我在下面的代码中

  • 在应用程序中创建了会话 在Redis CLI中运行“keys*”命令,看到一个新条目(如“spring:session:sessions:6b55103a-baf5-4a05-a127-3a9cfa15c164”) 从应用程序中向会话添加自定义bean 在Redis CLI中运行“keys*”命令,并看到该bean的另一个新条目(如“\xac\xed\x00\x05t\x00\tcustomer1

  • 我有一些cdibean。以前,它们都是JSF管理的bean(从JSF管理的bean更改为CDI管理的bean)。 我像下面这样做是为了删除用户成功下在线订单后管理的一些会话范围的JSF。 以便在订单处理完成后将所有内容设置为默认值。这与在订单处理成功终止后不能注销用户的整个HTTP会话的销毁/无效无关。 与JSF托管bean不同,CDIBean通过一些CDI管理器实现(如Weld)存储到服务器内存

  • 问题内容: 我有用于向会话添加变量的PHP代码: 当用户选择“删除”时,我想从会话数组中删除显示的变量。 但是,当我取消设置时,将删除数组中的所有变量。 如何仅删除一个变量? 问题答案: 由于是数组,因此需要找到指向您感兴趣的名称值的数组键。最后一行重新排列数组的索引,以供下次使用。