Получение списка всех онлайн-пользователей с помощью 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'),
Независимо от того, вхожу ли я под другим пользователем, я могу видеть только одного пользователя (мою учетную запись администратора).
Есть идеи, где я могу ошибиться?
Ваши пользователи не обрабатываются промежуточным ПО как онлайн, вероятно, потому что вы используете Django Rest Framework (DRF). DRF выполняет аутентификацию на уровне представления, из различных встроенных классов аутентификации только SessionAuthentication
будет аутентифицировать пользователя на уровне промежуточного программного обеспечения.
Для решения этой проблемы вы можете создать миксин, который будет использоваться всеми вашими представлениями / наборами представлений. Этот миксин должен переопределять метод initial
и делать то, что делает OnlineNowMiddleware
из django-online-users
:
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):
...