Django自动注销未在数据库中更新

时间:2019-03-02 05:50:53

标签: python django python-2.7 django-authentication django-login

我正在使用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个用户中。

1 个答案:

答案 0 :(得分:2)

您误解了is_active的含义。 Django使用此字段来确定是否允许用户登录,而不是确定用户当时是否登录。

即使您想创建自己的User字段来存储此信息,也很难做到,因为会话只是随着时间的流逝而过期。服务器上实际上没有发生任何可能触发模型字段更改的事情。

因此,如果需要确定所有登录用户,则需要使用会话存储。 Django没有提供直接的方法来做到这一点,但是肯定是可能的。 This answer显示了如何查询Session表以找出谁登录了。