web-dev-qa-db-fra.com

Comment expirer Django session en 5 minutes?

J'utilise ceci pour connecter l'utilisateur à:

def login_backend(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user)
            request.session.set_expiry(300)
            return HttpResponseRedirect('/overview/')
        else:
            return HttpResponseRedirect('/login_backend/')
    else:
        return render_to_response('login_backend.html', context_instance=RequestContext(request))

Je veux que la session expire après 5 minutes, j'ai donc ajouté request.session.set_expiry(300) dans la vue ci-dessus. Mais la session n'expire jamais. Qu'est-ce que je fais mal?

37
pynovice

Mise à jour pour Django 1.6

Le code du middleware ci-dessous ne fonctionne pas dans Django 1.6 et versions supérieures à cause de json sérialisable. Pour le faire fonctionner dans toutes les versions de Django, mettez le sérialiseur de session.

settings.py

#Handle session is not Json Serializable
SESSION_SERIALIZER = 'Django.contrib.sessions.serializers.PickleSerializer'

L'exemple ci-dessus de sérialiseur est pour Django 1.6. Veuillez rechercher une autre version. Merci ...

Créer middleware.py

from datetime import datetime, timedelta
from Django.conf import settings
from Django.contrib import auth


class AutoLogout:
  def process_request(self, request):
    if not request.user.is_authenticated() :
      #Can't log out if not logged in
      return

    try:
      if datetime.now() - request.session['last_touch'] > timedelta( 0, settings.AUTO_LOGOUT_DELAY * 60, 0):
        auth.logout(request)
        del request.session['last_touch']
        return
    except KeyError:
      pass

    request.session['last_touch'] = datetime.now()

Mettez à jour votre settings.py:

MIDDLEWARE_CLASSES = [
    .........................

    'app_name.middleware.AutoLogout', 
]

# Auto logout delay in minutes
AUTO_LOGOUT_DELAY = 5 #equivalent to 5 minutes
34
catherine

Il existe deux paramètres pour expirer les sessions, SESSION_EXPIRE_AT_BROWSER_CLOSE et SESSION_COOKIE_AGE . Si vous souhaitez expirer dans 5 minutes, vos paramètres devraient être les suivants:

SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_COOKIE_AGE = 5 * 60 #

Pour combiner les deux, apprenez comment écrire votre middleware personnalisé "Existe-t-il un moyen de combiner le comportement de SESSION_EXPIRE_AT_BROWSER_CLOSE et SESSION_COOKIE_AGE"

43
dani herrera

Django 1.9

Modifiez votre settings.py et ajoutez ce qui suit:

# SESSION AGE 5 Minutes
SESSION_COOKIE_AGE = 5*60
14
Slipstream

Selon votre projet, cela peut ne pas être suffisant.

Par exemple, que se passe-t-il si l'utilisateur passe 6 minutes à remplir un formulaire et clique sur "Enregistrer"? Le navigateur sera redirigé vers la page de connexion et les données du formulaire seront perdues.

Il existe également un problème de sécurité potentiel si l'utilisateur quitte son poste de travail avec des données confidentielles dans une page ouverte du navigateur.

Et si l'utilisateur lit une page pendant 6 minutes? Il n'est alors pas vraiment cool de le déconnecter sans avertissement ni aucun moyen de prolonger sa session ...

Compte tenu de ces questions, vous pourriez trouver Django-session-security utile.

13
jpic

Définissez le temps de session nécessaire avant d'appeler login ()!

...
request.session.set_expiry(300)
login(request, user)
...     
2
Dmitry Nikitin

Ça marche pour moi

settings.py

TIME= 240*60  //four hours  or your time
SESSION_SERIALIZER = 'Django.contrib.sessions.serializers.PickleSerializer'
SESSION_EXPIRE_AT_BROWSER_CLOSE= True
SESSION_COOKIE_AGE = TIME    //change expired session
SESSION_IDLE_TIMEOUT = TIME  //logout

middleware.py

from Django.contrib.auth import logout
from Django.contrib import messages
import datetime
from Django.shortcuts import redirect

import settings

class SessionIdleTimeout:
    def process_request(self, request):
        if request.user.is_authenticated():
            current_datetime = datetime.datetime.now()
            if ('last_login' in request.session):
                last = (current_datetime - request.session['last_login']).seconds
                if last > settings.SESSION_IDLE_TIMEOUT:
                    logout(request, login.html)
            else:
                request.session['last_login'] = current_datetime
        return None
2
jhonny lopez

J'utilise Django 2.1.7 et la façon la plus simple de faire expirer Django session est:

  • vous devez d'abord installer Django-session-timeout avec la commande:

    pip install Django-session-timeout

  • que ce dont vous avez besoin pour mettre à jour votre SessionTimeoutMiddleware dans settings.py

    MIDDLEWARE_CLASSES = [ ... 'Django.contrib.sessions.middleware.SessionMiddleware', 'Django_session_timeout.middleware.SessionTimeoutMiddleware', ... ]

  • vous devez enfin ajouter SESSION_EXPIRE_SECONDS à la fin de settings.py:

    SESSION_EXPIRE_SECONDS = 300 # 300 seconds = 5 minutes

Par défaut, la session expirera X secondes après le début de la session. Pour expirer la session X secondes après la dernière activité, utilisez le paramètre suivant:

SESSION_EXPIRE_AFTER_LAST_ACTIVITY = True

2
Mihael Waschl