2016-12-17 10 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

[OK]をいくつかの別のものを試した後、私はそれを得た。 ここで私はどのように動作させたのですか:

まず、ユーザがサーバに最後にアクセスしたときにmemcacheに保存するミドルウェアを作成します。

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 

やミドルウェアを追加することを忘れないでください:

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必要性をユーザーシリアライザを拡張:

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

古すぎるように思わサーバにダミーのリクエストを送信するJavaScriptの作品を書きます。これを60秒または数秒で繰り返すようにしてください。あなたがリクエストを受け取っている限り、あなたはページがオンであることを知っています。次に、そのユーザーが認証されているかどうかを確認できます。

+0

ユーザーは常にサーバーをリクエストします私は最後のアクセスを格納するためにミドルウェアが必要だと思う。そして、ユーザー情報を取得するとき、彼が最近ログインしたかどうかを検出することができます...しかし、私はその方法を知らない –

+0

この問題の解決方法はたくさんあります。ユーザーがアイドル状態であっても問題を解決するソリューションを提案しました。あなたはそれをdownvote好きではない。 – user902384

関連する問題