我正在使用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
。
我该如何解决这个问题?
答案 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')
但除此之外,此功能似乎具有正确的逻辑。
您确定它返回仅具有过期会话的用户吗?也许这些用户有一些活动会话和一些非活动会话,这就是为什么它们出现在输出中?