如何在django模板中检查用户是否在线?

时间:2015-04-16 01:24:04

标签: django django-templates django-sessions

在模板中,当我使用

{% if topic.creator.is_authenticated %}
Online
{% else %}
Offline
{% endif %}

即使用户刚刚退出,用户也会一直在线。所以我想知道如何正确检查在线用户?

4 个答案:

答案 0 :(得分:2)

您可以为每个用户提供一个整数字段,说明用户当前登录的会话数。每次用户登录时,您可以将其增加1,并在用户注销时将其减少1。

{% if topic.creator.login_count %}
Online
{% else %}
Offline
{% endif %}

这是解决此问题的简单方法。您可以定期通过ajax请求刷新此数据。

答案 1 :(得分:2)

正如documentation所说:

  

即使通常你会检查request.user上的is_autheticated属性以确定它是否已被AuthenticationMiddleware(代表当前登录的用户)填充,你应该知道任何User实例的这个属性都是True。

因此要检查用户是否在线我会做这样的事情:

<强> models.py

class Profile(models.Model):
    user = models.OneToOneField(User, related_name='profile')           
    is_online = models.BooleanField(default=False)

<强> views.py

from django.contrib.auth.signals import user_logged_in, user_logged_out
from django.dispatch import receiver    

@receiver(user_logged_in)
def got_online(sender, user, request, **kwargs):    
    user.profile.is_online = True
    user.profile.save()

@receiver(user_logged_out)
def got_offline(sender, user, request, **kwargs):   
    user.profile.is_online = False
    user.profile.save()

然后在您的模板中,您将检查用户是否在线:

{% if user.profile.is_online %}
    Online
{% else %}
    Offline
{% endif %}

不要忘记将用户实例返回到您的模板,以便user.profile.is_online能够正常工作。

答案 2 :(得分:1)

Django documentation

中描述了用户似乎始终在线的原因
  

<强> is_authenticated()

     
      
  • 始终返回 True ...这是一种判断用户是否已通过身份验证的方法。这并不意味着任何权限,也不会检查用户是否处于活动状态或是否具有有效会话。
  •   

您可以通过多种方式实现这一目标,但没有一种方法能够“内置”。

This question covers the last activity time of a user,您可以使用它来检查用户在过去几分钟内是否处于活动状态。

Alternatively, you can query the Session table检查用户是否有活动会话,但如果您的会话超时很长,则可能不准确。

答案 3 :(得分:0)

首先通过运行

安装django-online-users
pip install django-online-users

然后在您的settings.py

INSTALLED_APPS = [
...
'online_users',] 
MIDDLEWARE_CLASSES = (
...
'online_users.middleware.OnlineNowMiddleware',)

然后在您的视图中

import online_users.models



def see_users(self):

  user_status = online_users.models.OnlineUserActivity.get_user_activities(timedelta(seconds=60))
  users = (user for user in  user_status)
  context = {"online_users"}`

例如将上下文传递到您的模板

{% for user in users %}
  {{user.user}}
{% endfor %}

这将输出最近60秒钟内处于活动状态并且在线的用户