【问题标题】:Django: How can I check the last activity time of user if user didn't log out?Django:如果用户没有注销,我如何检查用户的最后活动时间?
【发布时间】:2013-02-04 11:14:02
【问题描述】:

django 的 User 模型有一个 last_login 字段,如果所有用户每次离开站点时都要注销,这很好,但如果他们不这样做呢?

我如何跟踪从未注销的用户及其在网站上的活动?

【问题讨论】:

    标签: python django middleware


    【解决方案1】:

    您需要在用户配置文件(或自定义用户模型)中有last_activity 字段。该字段将在每次请求时更新。为此,您需要自定义中间件:

    profiles/middleware.py:

    from django.utils import timezone
    
    from myproject.profiles.models import Profile
    
    
    class UpdateLastActivityMiddleware(object):
        def process_view(self, request, view_func, view_args, view_kwargs):
            assert hasattr(request, 'user'), 'The UpdateLastActivityMiddleware requires authentication middleware to be installed.'
            if request.user.is_authenticated():
                Profile.objects.filter(user__id=request.user.id) \
                               .update(last_activity=timezone.now())
    

    在你的设置文件中添加这个中间件:

    MIDDLEWARE_CLASSES = (
        # other middlewares
        'myproject.profiles.middleware.UpdateLastActivityMiddleware',
    )
    

    【讨论】:

    • 这似乎会导致大量的数据库写入,可能会影响性能。为了更有效,考虑将最后一个活动写入缓存,然后定期写入数据库。我相信bitbucket.org/ferranp/django-last-seen 可能就是这样做的。
    • 虽然这回答了问题,但当用户数量增加时,这破坏了我的 Django 安装。花了几个小时才弄清楚,所以我希望这篇文章可以节省一些时间!
    【解决方案2】:

    我知道这个问题很老了......而且肯定已经解决了...... 但这是我的贡献... 在新版本的 django 中,您可以使用:

    “会话时间” -> 在配置文件中使用。 “设置.py”

    如果用户关闭浏览器,会话结束,必须重新登录...
    SESSION_EXPIRE_AT_BROWSER_CLOSE = True
    
    
    如果用户没有关闭浏览器,您可以为会话设置时间限制...
    SESSION_COOKIE_AGE = 60 * 60 
    
    

    如果我没记错的话,对于“SESSION_COOKIE_AGE”,它是以秒为单位定义的。 你可以看到更多here... 推荐阅读也是django自己的documentation about sessions...

    【讨论】:

      猜你喜欢
      • 2019-08-17
      • 2013-09-23
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 2010-10-09
      • 2017-08-17
      • 2014-09-28
      • 1970-01-01
      相关资源
      最近更新 更多