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?
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
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"
Django 1.9
Modifiez votre settings.py et ajoutez ce qui suit:
# SESSION AGE 5 Minutes
SESSION_COOKIE_AGE = 5*60
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.
Définissez le temps de session nécessaire avant d'appeler login ()!
...
request.session.set_expiry(300)
login(request, user)
...
Ça marche pour moi
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
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
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