在模板中,当我使用
时{% if topic.creator.is_authenticated %}
Online
{% else %}
Offline
{% endif %}
即使用户刚刚退出,用户也会一直在线。所以我想知道如何正确检查在线用户?
答案 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)
<强>
is_authenticated()
强>
- 始终返回
True
...这是一种判断用户是否已通过身份验证的方法。这并不意味着任何权限,也不会检查用户是否处于活动状态或是否具有有效会话。
您可以通过多种方式实现这一目标,但没有一种方法能够“内置”。
This question covers the last activity time of a user,您可以使用它来检查用户在过去几分钟内是否处于活动状态。
Alternatively, you can query the Session table检查用户是否有活动会话,但如果您的会话超时很长,则可能不准确。
答案 3 :(得分:0)
首先通过运行
安装django-online-userspip 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秒钟内处于活动状态并且在线的用户