【问题标题】:Django - detect if user is online / offlineDjango - 检测用户是否在线/离线
【发布时间】:2017-05-03 04:25:09
【问题描述】:

我正在使用 Django 1.10 和 Django-REST。

我需要知道用户是否登录(离线/在线) 我怎样才能做到这一点?我正在使用基于令牌的身份验证。

我试过这个article,但它不适用于我的用例......它似乎太旧了

【问题讨论】:

标签: django django-rest-framework django-authentication


【解决方案1】:

好的,在尝试了一些不同的东西之后,我明白了。 以下是我的工作方式:

首先创建一个中间件来存储用户最后一次访问服务器时的内存缓存。

import datetime
from django.core.cache import cache
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin


class ActiveUserMiddleware(MiddlewareMixin):

    def process_request(self, request):
        current_user = request.user
        if request.user.is_authenticated():
            now = datetime.datetime.now()
            cache.set('seen_%s' % (current_user.username), now,
                           settings.USER_LASTSEEN_TIMEOUT)

然后使用属性onlinelast_seen 扩展用户序列化程序

class UserSerializer(serializers.ModelSerializer):

    last_seen = serializers.SerializerMethodField()
    online = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = ('url', 'id', 'username', 'email', 'first_name', 'last_name', 'groups', 'is_staff', 'avatar', 'last_seen', 'online')

    def get_last_seen(self, obj):
        last_seen = cache.get('seen_%s' % obj.username)
        obj.last_seen = last_seen
        return last_seen

    def get_online(self, obj):
        if obj.last_seen:
            now = datetime.datetime.now()
            delta = datetime.timedelta(seconds=settings.USER_ONLINE_TIMEOUT)
            if now > obj.last_seen + delta:
                return False
            else:
                return True
        else:
            return False

Settings.py 需要有这个新设置:

if os.name == 'nt':
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
            'LOCATION': 'c:/foo/bar',
        }
    }
else:
    CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
                'LOCATION': '127.0.0.1:11211',
            }
    }


# Number of seconds of inactivity before a user is marked offline
USER_ONLINE_TIMEOUT = 300

# Number of seconds that we will keep track of inactive users before
# their last seen is removed from the cache
USER_LASTSEEN_TIMEOUT = 60 * 60 * 24 * 7

别忘了添加你的中间件:

'api.resources.users.middleware.active_user.ActiveUserMiddleware',

【讨论】:

    【解决方案2】:

    编写一段 Javascript,它将向服务器发送一个虚拟请求。把这个重复说60或几秒钟。只要您收到请求,您就知道页面已打开。然后您可以检查该用户是否已通过身份验证。

    【讨论】:

    • 用户总是请求服务器。我想我需要一个中间件来存储最后一次访问。当获取用户信息时,我将能够检测他是否最近登录......但我不知道该怎么做
    • 这个问题可以有很多解决方案。我提出了一个解决方案,即使用户空闲也能解决问题。你不喜欢它,投反对票。
    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2016-01-16
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多