2014-09-10 1 views
1

Je cherche un moyen de garder une trace des utilisateurs qui sont en ligne/hors ligne. Donc, si je présente tous les utilisateurs dans une liste, je pourrais avoir une icône ou une sorte de drapeau pour montrer cela. Est-ce intégré dans le système d'authentification par défaut de Django? Ma première pensée était de simplement avoir un champ dans mes profils appelé last_logout dans les modèles et de le mettre à jour avec la date et l'heure chaque fois que l'utilisateur se déconnectait.Obtenir la liste des utilisateurs connectés avec Django

Avec cette info et le construit dans last_login je devrais être en mesure de faire une sorte de fonction pour déterminer si l'utilisateur est connecté/en ligne droite? Ou devrais-je simplement disposer d'un champ booléen appelé "en ligne" que je peux modifier lorsque l'utilisateur se connecte et se déconnecte?

+0

duplication possible de [Comment obtenir la liste des utilisateurs authentifiés?] (Http://stackoverflow.com/questions/2723052/how-to-get-the-list-of-the-authenticated-users –

+1

Un utilisateur peut se connecter puis fermer le navigateur. Cet utilisateur est-il en ligne? Tout dépend de la façon dont vous voulez qu'il soit proche du temps réel. – Germano

Répondre

3

Avec seulement django, ce sera difficile à faire. Pour une telle tâche les cadres asynchrones sont plus appropriés.

Par exemple, tornado.

Les utilisateurs ne se déconnecteront pas explicitement chaque fois qu'ils se déconnectent. Ils ferment juste leur navigateur et c'est tout. Vous ne pouvez pas le savoir avec seulement l'application django auth. Il n'est pas conçu pour de telles tâches.

Même si vous ne vérifiez pas la date d'expiration de la session, elle ne vous donne pas tous les utilisateurs en ligne, car la session peut être expirée depuis 30 jours.

Donc, pour obtenir de véritables utilisateurs en ligne, les solutions possibles sont les suivantes:

  1. Chaque utilisateur envoie des données via javascript sur votre serveur, par exemple toutes les 10 secondes. Vous pouvez récupérer ces données sur le serveur et mettre l'utilisateur dans le cache et définir la clé du cache pour qu'elle soit active pendant 10 secondes. Donc, quand vous avez besoin de savoir, qui sont en ligne maintenant, vous allez vérifier votre cache. Mais ce n'est pas une bonne solution, car il faudra beaucoup de ressources serveur.
  2. Utilisez le cadre asynchrone (tornado) côté serveur (vous pouvez configurer un processus séparé pour les demandes exactes). Et utiliser des websockets (SockJS est une bonne bibliothèque pour cela du côté client). C'est une solution plus compliquée, mais c'est mieux.
+0

Merci pour votre réponse! On dirait que c'était plus compliqué que je ne le pensais. Je suis encore en développement et n'ai pas encore commencé à apprendre des sessions et à mettre en cache. Je suppose que je dois aller "vivre" pour la deuxième solution? – user3199840

+0

@ user3199840, je dirais, cela dépend. Si vous ne vous attendez pas à un trafic important sur votre application, vous pouvez choisir la 1ère solution, car elle est plus rapide à implémenter. Si vous n'êtes pas familier avec les frameworks async, vous aurez besoin de temps pour y plonger. – stalk

+0

Ok. Peut-être est-il préférable de simplement utiliser le last_login intégré ou une sorte de champ timestamp last_activity à la place pour gagner du temps et des performances. Je veux juste que les utilisateurs aient une idée de quand les autres utilisateurs étaient actifs. Merci encore – user3199840

2

Vous devez considérer ce que signifie exactement pour les utilisateurs d'être "en ligne". Comme n'importe quel utilisateur peut fermer la fenêtre du navigateur à tout moment et sans que le serveur ne soit au courant de cette action, vous auriez beaucoup de faux utilisateurs «en ligne».

Vous avez deux options de base:

  • mailez de la dernière fois de l'activité de l'utilisateur. Chaque fois que l'utilisateur charge une page, vous mettez à jour la valeur de la minuterie. Pour obtenir une liste de tous les utilisateurs en ligne, vous devez sélectionner ceux qui ont une activité avant X minutes. C'est ce que font certains forums web.

  • Ouvrez une socket Web, une connexion d'interrogation longue ou un battement de cœur sur le serveur. C'est ce que fait le chat sur Facebook. Vous aurez besoin de plus que django, car pour garder une connexion ouverte, un autre type de ressources côté serveur est nécessaire.

+0

Ou peut-être juste un Ajax qui peste le serveur régulièrement. –

+0

Merci pour votre réponse! Je me demande. Ne pouvez-vous pas résoudre les "faux" utilisateurs en ligne en ayant une sorte de déconnexion automatique? Ou cela conduirait-il à d'autres problèmes indésirables? – user3199840

+2

@ user3199840, Cela conduirait au problème indésirable de déconnecter éventuellement vos utilisateurs quand ils sont actifs et au milieu de quelque chose :) –

Questions connexes