【问题标题】:Auto logged out user on inactivity still displaying as active use in Django不活动时自动注销的用户在 Django 中仍显示为活动使用
【发布时间】:2019-11-23 06:48:29
【问题描述】:

我正在使用 Python(2.7) 和 Django(1.11) 开发一个项目,在该项目中我只需要显示特定功能的登录用户。

我已经通过settings.py中的以下设置实现了注销用户:

SESSION_COOKIE_AGE = 180
SESSION_SAVE_EVERY_REQUEST = True
LOGOUT_REDIRECT_URL = 'login'

我需要获得driver 类型的活跃用户,我得到的是:

def get_all_logged_in_users():
    # Query all non-expired sessions
    # use timezone.now() instead of datetime.now() in latest versions of Django
    sessions = Session.objects.filter(expire_date__gte=timezone.now())
    uid_list = []

    # Build a list of user ids from that query
    for session in sessions:
        data = session.get_decoded()
        print(data)
        uid_list.append(data.get('user_id', None))

    # Query all logged in users based on id list
    return user_table.objects.filter(id__in=uid_list, user_type='driver')

几天前它还在工作,但突然停止工作了。当我在SESSION_COOKIE_AGE 传递时间后刷新页面时,它被重定向到完美的登录页面,但在数据库中,该用户的is_active 仍然是True,它仍然显示在get_all_logged_in_users 中。

我该如何解决这个问题?

【问题讨论】:

    标签: python django python-2.7 django-sessions django-1.11


    【解决方案1】:

    我不完全确定我理解你的问题,但我会尝试澄清一些事情。


    首先,Session 框架存储了每个会话的到期日期,但不活动的会话不会自动删除;为此,您可以在 cron 作业中使用 management command clearsessions


    其次,User.is_active 字段不表示是否存在活动会话;文档说:

    指定是否应将此用户帐户视为活动帐户。 我们建议您将此标志设置为 False 而不是删除帐户 [...]


    您的函数get_all_logged_in_users() 似乎正确;一个小的改进可能是避免将 None 添加到 id 列表中,甚至可以将该列表添加到 set 中,以避免对有很多活动会话的用户重复。

    def get_all_logged_in_users():
        user_id_set = set()
    
        for session in Session.objects.filter(expire_date__gte=timezone.now()):
            user_id = session.get_decoded().get('user_id', None)
            if user_id is not None:
                user_id_set.add(user_id)
    
        return user_table.objects.filter(id__in=user_id_set, user_type='driver')
    

    但除此之外,这个函数似乎有正确的逻辑。

    您确定它返回只有过期会话的用户吗?也许这些用户有一些活动和一些非活动会话,这就是他们出现在输出中的原因?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2014-09-28
      • 2014-10-20
      • 2011-08-04
      • 1970-01-01
      • 2011-03-05
      • 2013-09-23
      相关资源
      最近更新 更多