1

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

我该如何解决这个问题?

4

1 回答 1

0

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


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


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

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


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

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

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

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

于 2019-07-15T13:39:34.973 回答