18 votes

Django expiration de session?

De la documentation de django, j'ai eu l'impression qu'en appelant :

request.session.set_expiry(300)

depuis une vue entraînerait l'expiration de la session après cinq minutes d'inactivité; cependant, ce n'est pas le comportement que je rencontre dans django trunk. Si j'appelle cette méthode depuis une vue, et que je navigue vers d'autres vues qui ne l'appellent pas, la session expire en cinq minutes. Le comportement que j'attendais était une expiration seulement après cinq minutes d'inactivité et non simplement le fait de ne pas appeler à nouveau set_expiry avant l'expiration.

Ma question est donc est-ce que j'ai vraiment besoin d'appeler set_expiry dans chaque vue ? Si oui, existe-t-il un décorateur qui pourrait m'aider ? Je ne peux pas imaginer que cela ne fasse pas partie de contrib.

Merci, Pete

33voto

SmileyChris Points 5405

En tant qu'auteur de ces méthodes, je constate que la documentation n'est pas très claire à ce sujet. Vos observations sont correctes : seules les requêtes qui modifient la session sont considérées comme une "activité".

Vous pouvez utiliser le SESSION_SAVE_EVERY_REQUEST paramètre pour obtenir le comportement que vous souhaitez (au prix évident de devoir sauvegarder la session à chaque requête).

Remarque : Cela mettra à jour l'enregistrement de session existant avec la dernière date d'expiration.

4voto

Mike Points 383

Un middleware simple serait probablement mieux que de le configurer dans chaque vue. Voici ce que j'ai utilisé.

class SessionExpiry(object):
    """ Définir l'expiration de la session selon les paramètres """
    def process_request(self, request):
        if getattr(settings, 'SESSION_EXPIRY', None):
            request.session.set_expiry(settings.SESSION_EXPIRY)
        return None

Cela dépend de SESSION_EXPIRY étant défini dans votre configuration. Son format est le même que celui de request.session.set_expiry.

MIDDLEWARE_CLASSES doit être défini dans cet ordre en tête :

MIDDLEWARE_CLASSES = (
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    '..middleware.SessionExpiry',
    ...
}

Il serait bien si django.contrib.sessions prenait en compte ce paramètre par défaut.

0voto

Si vous définissez "True" à SESSION_SAVE_EVERY_REQUEST dans "settings.py" comme indiqué ci-dessous, automatiquement, la session est mise à jour chaque fois que la page actuelle est rouverte ou qu'une autre page est ouverte dans le site Web Django.

SESSION_SAVE_EVERY_REQUEST = True # False par défaut

Par exemple, la session expire en 15 minutes. Ensuite, à partir de 15h00, une session démarre en se connectant sur la page dans le site Web Django donc la session expire à 15h15. Ensuite, à 15h10, la page actuelle est rouverte ou une autre page est ouverte dans le site Web Django donc la session est mise à jour donc la nouvelle session expire à 15h25 ce qui signifie que vous êtes connecté jusqu'à 15h25, donc en d'autres termes, si la page actuelle n'est pas rouverte ou qu'une autre page n'est pas ouverte dans le site Web Django alors la nouvelle session expire à 15h25 ce qui signifie que vous êtes déconnecté à 15h25 donc vous devez vous reconnecter à la page dans le site Web Django pour démarrer une nouvelle session.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X