簡體   English   中英

使用 Django-online-users 檢索所有在線用戶的列表

[英]Retrieving list of all online users using 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

我的 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'),

無論我是否使用其他用戶登錄,我都只能看到一個用戶(我的管理員帳戶)。

更新

根據我收到的最佳答案,這是我嘗試過的:

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 Framework (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):
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM