Django:如果用户没有注销,我如何查看用户的上次活动时间?

la_*_*0ka 11 python django middleware

django的用户模型有一个last_login字段,如果所有用户每次离开网站时都要注销,那就太棒了,但如果他们不这样做呢?

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

Aam*_*nan 24

您需要last_activity在用户配置文件(或自定义用户模型)中包含该字段.该字段将在每个请求时更新.要实现这一点,您需要拥有自定义中间件:

配置文件/ 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())
Run Code Online (Sandbox Code Playgroud)

在您的设置文件中添加此中间件:

MIDDLEWARE_CLASSES = (
    # other middlewares
    'myproject.profiles.middleware.UpdateLastActivityMiddleware',
)
Run Code Online (Sandbox Code Playgroud)

  • 这似乎会导致数据库写入数量非常大,可能会影响性能.为了提高效率,可以考虑将最后一个活动写入缓存,然后定期写入数据库.我相信这可能是https://bitbucket.org/ferranp/django-last-seen所做的. (5认同)
  • 虽然这回答了这个问题,但当用户数量增加时,这破坏了我的Django安装.花了几个小时才搞清楚,所以我希望这篇文章可以节省一些时间! (2认同)