Django: date de la dernière visite de l'utilisateur

dans Django, nous pouvons obtenir le dernier utilisateur de temps connecté en utilisant Auth.User.last_login. Il n'est mis à jour que lorsque l'utilisateur se connecte en utilisant son nom d'utilisateur/mot de passe. Supposons que l'utilisateur soit déjà connecté et que l'information d'authentification soit sauvegardée dans un cookie, il peut donc accéder au site sans se connecter. Comment obtenir la date à laquelle l'Utilisateur a déjà visité le site? Ce serait utile pour les requêtes telles que l'obtention du nombre de nouveaux enregistrements depuis la dernière visite.

19
demandé sur user2233706 2013-08-26 02:26:11

3 réponses

exemple de modèle:

class User(models.Model):
    last_visit = models.DateTimeField(...)
    ...

exemple middleware qui sera exécuté pour tous les utilisateurs connectés:

from django.utils.timezone import now

class SetLastVisitMiddleware(object):
    def process_response(self, request, response):
        if request.user.is_authenticated():
            # Update last visit time after request finished processing.
            User.objects.filter(pk=request.user.pk).update(last_visit=now())
        return response

ajouter le nouveau middleware à votre settings.py:

MIDDLEWARE_CLASSES = (
    ...
    'path.to.your.SetLastVisitMiddleware',
    ...
)

attention: pas testé, mais ne nécessite pas l'installation de paquets externes et il n'y a que 5 lignes de code.

Voir plus dans les documents à propos de Middleware et utilisateur personnalisée modèles (depuis Django 1.5)

26
répondu HankMoody 2013-09-03 16:30:10

voici un middleware qui gardera la trace de la dernière activité de l'utilisateur et le compte séparé par intervalles de temps. L'utilisation de l'intervalle crée des "sessions" discrètes qui peuvent être suivies/comptées avec l'avantage de minimiser écrit à la base de données.

chaque fois qu'un utilisateur auth exécute une requête, va frapper le cache pour trouver leur dernière activité, puis mettre à jour le cache avec un nouvel horodatage. Si l' activité a eu un écart d'au moins "intervalle" de temps, puis il mettra à jour le base de données d'horodatage.

from datetime import timedelta as td
from django.utils import timezone
from django.conf import settings
from django.db.models.expressions import F    
from <user profile path> import UserProfile  

class LastUserActivityMiddleware(object):
    KEY = "last-activity"

    def process_request(self, request):
        if request.user.is_authenticated():
            last_activity = request.session.get(self.KEY)

            # If key is old enough, update database.
            too_old_time = timezone.now() - td(seconds=settings.LAST_ACTIVITY_INTERVAL_SECS)
            if not last_activity or last_activity < too_old_time:
                UserProfile.objects.filter(user=request.user.pk).update(
                        last_login=timezone.now(),
                        login_count=F('login_count') + 1)

            request.session[self.KEY] = timezone.now()

        return None

Commentaires:

  1. Comment vous définissez settings.LAST_ACTIVITY_INTERVAL_SECS déterminer ce qui constitue l'intervalle de non-activité, considérée comme une nouvelle connexion.
  2. ceci met à jour un objet" UserProfile " que j'ai à 1:1 avec mes objets utilisateurs, mais vous pouvez mettre à jour n'importe quel objet que vous voulez.
  3. assurez-vous de l'inclure dans settings.MIDDLEWARE_CLASSES.
  4. notez que ce middleware utilise process_requestprocess_response autrement dépendant de l'ordre de middleware, APPEND_SLASH peut causer request.user non disponible tel que discuté: Django: Wsgirequest ' object n'a pas d'attribut 'user' sur certaines pages?
9
répondu John Lehmann 2017-05-23 12:34:08

je dirais django-last-seen

Utilisation:

from last_seen.model import LastSeen

seen = LastSeen.object.when(user=user)
2
répondu YoungCoder 2013-08-25 22:34:07