[英]Push message to all online users using Flask, WITHOUT creating threads for each 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.