我正在使用Python(2.7)和Django(1.11)开发一个项目,需要在其中执行几分钟或几小时的不活动状态自动注销。
注意:我进行了很多搜索,并研究了一个相关的问题,但找不到针对我特定问题的任何解决方案,请不要将其标记为重复! / p>
我通过在settings.py
中添加一些设置来实现此目的:
SESSION_COOKIE_AGE = 120
SESSION_SAVE_EVERY_REQUEST = True
LOGOUT_REDIRECT_URL = 'mainlogin'
仅出于测试目的,我将其设置了2分钟。
2分钟后,当我刷新页面时,用户注销并重定向到登录页面,但在后端/数据库中,用户的状态仍然为active
。
我需要使用活动用户进行进一步的处理/执行,因此,如果自动注销的用户不应该是活动用户,则应该是活动用户。
如果我手动注销了该用户,则该消息不再显示在活动用户中,这意味着手动注销运行良好,但是自动注销仍然将用户显示为active
用户。
这是我吸引活跃用户的方式:
all_active_users = user_table.objects.filter(user_type='a', status=1, approval_status=1, is_active=True)
# further execution
更新:我正在使用名为
user_table
的用户自定义模式,这是答案所建议的尝试方式:
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()
uid_list.append(data.get('id', None))
# Query all logged in users based on id list
return user_table.objects.filter(id__in=uid_list)
它返回空查询集为:active drivers are: <QuerySet []>
,即使类型为driver
的用户也已登录。
如何解决此问题,所以当用户自动注销时,它将不会显示在active
个用户中。
答案 0 :(得分:2)
您误解了is_active
的含义。 Django使用此字段来确定是否允许用户登录,而不是确定用户当时是否登录。
即使您想创建自己的User
字段来存储此信息,也很难做到,因为会话只是随着时间的流逝而过期。服务器上实际上没有发生任何可能触发模型字段更改的事情。
因此,如果需要确定所有登录用户,则需要使用会话存储。 Django没有提供直接的方法来做到这一点,但是肯定是可能的。 This answer显示了如何查询Session
表以找出谁登录了。