Django - 检测用户是否在线/离线
Django - detect if user is online / offline
我正在使用 Django 1.10 和 Django-REST。
我需要知道用户是否登录(离线/在线)
我怎样才能做到这一点?我正在使用基于令牌的身份验证。
我试过这个 article 但它对我的用例不起作用...它似乎太旧了
写一段Javascript,它将向服务器发送一个虚拟请求。重复 60 秒或几秒。只要您收到请求,您就知道页面已打开。然后您可以检查该用户是否已通过身份验证。
好的,在尝试了一些不同的东西后我明白了。
以下是我的工作方式:
首先创建一个Middleware,将用户上次访问服务器的时间存放在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',
我正在使用 Django 1.10 和 Django-REST。
我需要知道用户是否登录(离线/在线) 我怎样才能做到这一点?我正在使用基于令牌的身份验证。
我试过这个 article 但它对我的用例不起作用...它似乎太旧了
写一段Javascript,它将向服务器发送一个虚拟请求。重复 60 秒或几秒。只要您收到请求,您就知道页面已打开。然后您可以检查该用户是否已通过身份验证。
好的,在尝试了一些不同的东西后我明白了。 以下是我的工作方式:
首先创建一个Middleware,将用户上次访问服务器的时间存放在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',