【问题标题】:Django auto logout not updating in DatabaseDjango自动注销未在数据库中更新
【发布时间】:2019-07-24 03:16:17
【问题描述】:

我正在使用 Python(2.7) 和 Django(1.11) 开展一个项目,我需要在几分钟或几小时内不活动时实现自动注销。

注意:我搜索了很多并查看了各种相关问题,但找不到针对我的具体问题的任何解决方案,所以请不要将其标记为重复!

我通过在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用户中。

【问题讨论】:

  • 我会推荐一个自定义会话后端,其中包含一个 expiry/last_active 列,该列会在每个请求时更新,或者为了提高性能,一个 Redis 支持的会话存储,您可以使用 Redis 的本机到期。

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


【解决方案1】:

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

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

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

【讨论】:

  • 嗨@KevinChristopherHenry,我正在为名为@9​​87654326@ 的用户使用自定义模型,那么如何在您建议的get_all_logged_in_users 的代码中使用自定义模型?
  • @AbdulRehman:只需使用user_table.objects 而不是User.objects
  • 我也尝试过更新问题,但是当一些用户登录时它返回一个空的queryset
  • 现在将data.get('_auth_user_id', None)更改为data.get('user_id', None)后工作正常
猜你喜欢
  • 2020-08-12
  • 2016-05-17
  • 2021-11-23
  • 2010-11-09
  • 2012-08-20
  • 2020-07-09
  • 1970-01-01
  • 2021-06-02
  • 2019-12-09
相关资源
最近更新 更多