【问题标题】:Django: How to detect inactivity session time out?Django:如何检测非活动会话超时?
【发布时间】:2018-07-21 18:53:04
【问题描述】:

我正在使用 django.auth.db 连接并创建了一个表,其中包含已登录用户的用户名以及当用户手动注销时(通过单击注销按钮)我正在删除该表中的他/她的用户名。当用户由于会话退出而退出并且我无法从该表中删除他/她的用户名时会出现问题。

所以我想知道有什么方法可以检测用户的会话/cookie 何时退出,以便我可以从该表中删除他/她的用户名?

【问题讨论】:

    标签: django session cookies


    【解决方案1】:

    首先,您需要从会话存储中检索具有活动会话的用户列表,然后您需要将此列表与表中的用户进行比较,并删除表中不在列表中的用户。

    您可以从会话存储like so 中检索用户列表:

    from django.contrib.sessions.models import Session
    from django.utils import timezone 
    
    # 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('_auth_user_id', None))
    

    然后您可以循环遍历 uid_list 并与您的表进行比较,使用一些逻辑,例如(说明性)

    for user in table
        if user not in uid_list
            user.remove_from_table()
    

    【讨论】:

      【解决方案2】:

      您可以使用下一条命令从会话存储中清除所有过期的会话。

      django-admin clearsessions
      

      与使用相同的结果:

      ./manage.py clearsessions
      

      如果您将存储配置为数据库,那么它将从数据库中删除会话。

      文档: https://docs.djangoproject.com/en/dev/ref/django-admin/#django-contrib-sessions

      如果你想在你的视图中做,你可以调用方法clear_expired()

      request.session.clear_expired()
      

      文档:https://docs.djangoproject.com/en/2.0/topics/http/sessions/#django.contrib.sessions.backends.base.SessionBase.clear_expired

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-26
        • 2012-02-09
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多