自动注销的用户处于非活动状态,在Django中仍显示为活动使用状态

时间:2019-07-14 06:00:15

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

我正在使用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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我不能完全确定我是否理解您的问题,但是我将尝试清除一些问题。


首先,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')

但除此之外,此功能似乎具有正确的逻辑。

您确定它返回仅具有过期会话的用户吗?也许这些用户有一些活动会话和一些非活动会话,这就是为什么它们出现在输出中?