7
votes

Quelle est la meilleure façon de mettre en œuvre une fonction "Dernière vue" dans une application Web Django?

J'ai une application Memcached en cours d'exécution Django / Apache2 + Memcached (Ubuntu) et souhaitez garder une trace des utilisateurs connectés en ligne.

Quelle serait la meilleure façon de suivre cela?

Je préférerais ne pas écrire à la base de données à chaque fois qu'un utilisateur connecté charge une page; Mais quelles autres options y a-t-il?


1 commentaires

Alors, comment s'est-il avéré pour vous? Je serais intéressé par votre propre solution ...


4 Réponses :


4
votes

Une approche pourrait être:

Vous créez un middleware qui suit sur Process_Response:

  • Vérifiez un cookie appelé «Online», mais uniquement si l'utilisateur est authentifié
  • Si le cookie n'est pas là,
    • Définissez un cookie appelé «en ligne» avec la valeur '1'
    • Définissez la durée de vie du cookie à 10 minutes
    • Mettez à jour le champ 'last_login' d'auth.User pour cet utilisateur avec la dateTime actuelle

      Vous avez maintenant tous les utilisateurs actuellement connectés dans votre Auth.User Table. Tous les utilisateurs qui ont un last_login plus récent que DateTime.Now () - Intervalle (15minutes) pourrait être considéré comme «en ligne».

      La base de données sera écrite pour chaque utilisateur connecté environ toutes les 10 minutes. Ajustez les valeurs "10" et "15" à vos besoins.

      L'avantage ici est que les écrivies de base de données sont rares (selon vos deux paramètres numériques 10/15). Et pour l'optimisation de la vitesse, assurez-vous que Last_Login est indexé, un filtre sur ce champ comprenant le nombre est vraiment rapide.

      J'espère que cela aide.


1 commentaires

J'aime cette idée, sauf que je ne voudrais pas mettre à jour le champ Last_Login d'Auth.User. Je mettrais à jour un modèle de profil utilisateur ou peut-être un autre modèle. Comment allez-vous étendre cela aux utilisateurs non authentifiés? Je suppose que beaucoup de robots n'utiliseraient pas de cookies. Vous pourriez avoir à suivre via une adresse IP en quelque sorte.



1
votes

Un hashmap ou une file d'attente en mémoire avec une tâche exécutée toutes les heures de la persistance.


0 commentaires

0
votes

Vous ne pouvez pas faire cela à Django sans utiliser de base de données / de stockage persistant en raison de la même raison pour laquelle les sessions Django sont stockées dans la base de données: il peut y avoir plusieurs instances de vos applications à exécuter et que les données doivent synchroniser leurs états + une source de persistance unique [1]

Alternativement, vous voudrez peut-être écrire ces informations dans un dossier dans un fichier nommé ID utilisateur, puis vérifier sa date de création / modifiée pour trouver les informations requises.


1 commentaires

Les sessions Django ne doivent pas être stockées dans la base de données. Ils peuvent être stockés dans le cache.



1
votes

Vous devez persister le côté du serveur Info, l'intégrité n'est pas importante, le débit et la latence sont importants. Cela signifie que vous devez utiliser une sorte de magasin de la valeur clé.

Memcached et Redis ont des clés qui expirent. Vous avez probablement des memcaches déjà installées, utilisez donc ça.

Vous pouvez réinitialiser l'heure d'expiration de l'utilisateur : Dernier vu: $ Nom d'utilisateur TOUCHE TOUTE VISITE, ou vous pouvez utiliser la technique de cookie de Mawimawi et avoir expiry = 4 * Cookie-Lifetime.


2 commentaires

Mais comment récupéreriez-vous quels utilisateurs sont en ligne dans le cache, par exemple pour afficher dans une étiquette de modèle?


J'ai compris que l'OP ne voulait que "en ligne maintenant" Lighbulb sur les vignettes et les pages de profilé, et qu'il y avait trop d'utilisateurs en ligne pour montrer une liste. D'autres ont répondu avec différentes hypothèses.