检索使用Django-online-users的所有在线用户的列表



我想检索我的所有在线用户的列表,在线意味着他们在过去2分钟内对应用程序进行了某种活动。

我注意到,然而,我的列表只显示了以管理员身份登录的人(至少从我观察到的)。

我使用的是django-online-users

我创建了一个带有查询集的视图,该查询集将检索所有在应用程序上执行过某些活动的在线用户

class OnlineUsers(viewsets.ModelViewSet):
queryset = online_users.models.OnlineUserActivity.get_user_activities(timedelta(seconds=120))
serializer_class = OnlineUsersSerializer

My OnlineUsersSerializer类:

class OnlineUsersSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = '__all__'

这是我的个人资料模型:

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
city = models.CharField(max_length=50,blank=True)
country = models.CharField(max_length=50, blank=True)
bio = models.CharField(max_length=500, blank=True)
profile_pic = models.ImageField(upload_to='profile/%Y/%m/%d',
default='media/placeholder.png',
blank=False,
null=False)
#we are hooking create_user_profile and save_user profile methods to the User model whenever a save event occurs. This kind of signal is called post_save
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()

我创建了一个API端点,我将使用它从我的React应用程序中检索所有在线用户:

path('online_users',OnlineUsers.as_view({'get':'list'}), name='online_users'),

无论我是否使用不同的用户登录,我都只能看到一个用户(我的admin帐户)。

根据我收到的最上面的答案,这是我尝试的:

class OnlineNowMixin:
def initial(self, request, *args, **kwargs):
super().initial(request, *args, **kwargs)
user = request.user
if not user.is_authenticated:
return
online_users.models.OnlineUserActivity.update_user_activity(user)

我把这个类添加到我所有的视图集:

class OnlineUsers(OnlineNowMixin, viewsets.ModelViewSet):
...
class UserViewSet(OnlineNowMixin, viewsets.ModelViewSet):
...
class UpdateProfileView(OnlineNowMixin, generics.UpdateAPIView):
...
class ProgrammingChallengeView(OnlineNowMixin, ReadOnlyModelViewSet):
...
class GetAllUsers(OnlineNowMixin, viewsets.ModelViewSet):
...

但是,我创建的API端点仍然只显示登录的用户,而不是通过身份验证登录的用户。收到访问&刷新令牌)。

这是我用来验证的:

class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
token['username'] = user.username
token['first_name'] = user.first_name
token['last_name'] = user.last_name
token['country'] = user.profile.country
token['city'] = user.profile.city
token['bio'] = user.profile.bio
token['photo'] = json.dumps(str(user.profile.profile_pic))
return token
class CustomTokenObtainPairView(TokenObtainPairView):
serializer_class = CustomTokenObtainPairSerializer

你的用户没有被中间件作为在线处理,可能是因为你使用的是Django Rest框架(DRF)。DRF在视图层执行身份验证,在各种内置身份验证类中,只有SessionAuthentication将在中间件级别对用户进行身份验证。

要解决这个问题,你可以创建一个mixin,供所有的视图/视图集使用。。这个mixin应该覆盖initial方法,并做django-online-users中的OnlineNowMiddleware所做的事情:
from online_users.models import OnlineUserActivity

class OnlineNowMixin:
def initial(self, request, *args, **kwargs):
super().initial(request, *args, **kwargs)
user = request.user
if not user.is_authenticated:
return
OnlineUserActivity.update_user_activity(user)

class OnlineUsers(OnlineNowMixin, viewsets.ModelViewSet):
...

相关内容

  • 没有找到相关文章

最新更新