2016-12-17 3 views
0

Я использую Django 1.10 с Django-REST.Django - обнаружение, если пользователь находится в режиме онлайн/офлайн

Мне нужно знать, был ли пользователь зарегистрирован или нет (офлайн/онлайн) Как я могу это сделать? Я использую аутентификацию на основе токенов.

Я попытался это article, но он не работает для моего случая использования ... это, кажется, слишком стар

+0

посмотреть это сообщение, может быть, это поможет вам http://stackoverflow.com/questions/29663777/how-to-check-whether-a-user-is-online-in-django-template –

ответ

1

Хорошо, попробовав несколько разных вещей, я получил его. Вот как я сделал это:

Сначала создайте промежуточное программное обеспечение для хранения в memcache при последнем доступе пользователя к серверу.

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) 

Затем расширить сериалайзер пользователя со свойствами online и last_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', 
-1

Написать кусок Javascript, который будет отправлять фиктивный запрос на сервер. Положите это на повторение, скажем, 60 или несколько секунд. Пока вы получаете запросы, которые вы знаете, страница включена. Затем вы можете проверить, аутентифицирован ли этот пользователь.

+0

Пользователи всегда запрашивают сервер .. Я думаю, мне нужно промежуточное программное обеспечение для хранения последнего доступа. И при получении информации о пользователе я смогу обнаружить, если он зашел в систему в последнее время ... Но я не знаю, как это сделать –

+0

Решения этой проблемы могут быть решены. Я предложил решение, которое решит проблему, даже если пользователь простаивает. Вам это не нравится. – user902384

Смежные вопросы