2013-02-12 10 views
25

ich dies mit dem Benutzer in einzuloggen:Wie läuft die Django-Sitzung in 5 Minuten ab?

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)) 

I Sitzung nach 5 Minuten ablaufen soll also fügte ich request.session.set_expiry(300) in der obigen Ansicht. Aber die Sitzung läuft nie ab. Was mache ich falsch?

+0

Ich habe bereits dieselbe Frage beantworten, hier ist der Link http://stackoverflow.com/questions/14808238/middleware -ist-nicht-Arbeit-erwartet/14808426 # 14808426. Wenn Sie eine Klarstellung haben, sagen Sie mir einfach – catherine

+0

Wenn der Benutzer die Anwendung öffnet, möchte ich nicht, dass die Sitzung abläuft. Wenn der Benutzer die Anwendung 5 Minuten lang nicht geöffnet hat, soll die Sitzung ablaufen. – pynovice

+0

Ja, das stimmt, das ist meine Antwort. Wenn der Benutzer inaktiv ist, wird er automatisch abgemeldet. Willst du, dass ich hier die ganze Antwort poste? – catherine

Antwort

29

Update für Django 1.6

Der Middleware-Code unten funktioniert nicht in Django 1.6 und höher Version wegen json serializable. Damit es in allen Versionen von Django funktioniert, lege den Session-Serializer ein.

settings.py

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

Die obige Probe von Serialisierer ist für Django 1.6. Bitte suchen Sie nach anderen Versionen. Dank ...

erstellen 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() 

Aktualisieren Sie Ihre settings.py:

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

    'app_name.middleware.AutoLogout', 
] 

# Auto logout delay in minutes 
AUTO_LOGOUT_DELAY = 5 #equivalent to 5 minutes 
+0

Dies funktioniert nicht mit Django 1.6 obwohl :( – Hec

+0

@hec es funktioniert, wenn Sie die Einstellung für Session-Serializer setzen, die die ' ist nicht Json serializable' – catherine

+0

oder Sie könnten datetime.now() zu Zeit ändern. time(). Machen Sie andere kleine relevante Änderungen an der Bedingungslogik, und es funktioniert auf dem JSON-Serializer. – Hec

27

Sie sind zwei Parameter zum Ablauf der Sitzungen, SESSION_EXPIRE_AT_BROWSER_CLOSE und SESSION_COOKIE_AGE. Wenn Sie Ihre Einstellungen sollten wie in 5 Minuten ablaufen sollen wie:

SESSION_EXPIRE_AT_BROWSER_CLOSE = False 
SESSION_COOKIE_AGE = 5 * 60 # 

beide kombinieren lernen, wie es Ihre individuelle Middleware "Is there a way to combine behavior of SESSION_EXPIRE_AT_BROWSER_CLOSE and SESSION_COOKIE_AGE"

+0

Wenn der Benutzer die Anwendung öffnet, möchte ich nicht Sitzung ablaufen. Wenn der Benutzer die Anwendung 5 Minuten lang nicht geöffnet hat, soll die Sitzung ablaufen. – pynovice

+0

Beachten Sie, dass mein Middleware-Code nach request.user.is_authenticated() sucht. – danihp

11

Je nach Projekt kann schreiben, könnte dies nicht ausreichend sein.

Zum Beispiel, was passiert, wenn der Benutzer 6 Minuten ein Formular ausfüllt und auf "Speichern" klickt? Der Browser wird zur Anmeldeseite weitergeleitet und die Formulardaten gehen verloren.

Es gibt auch ein potenzielles Sicherheitsproblem, wenn der Benutzer seine Arbeitsstation mit vertraulichen Daten in einer geöffneten Seite des Browsers verlässt.

Was ist, wenn der Benutzer eine Seite während 6 Minuten liest? Es ist dann nicht wirklich cool, ihn ohne Vorwarnung abzumelden oder irgendeinen Weg, um seine Sitzung zu verlängern ...

In Anbetracht dieser Fragen könnten Sie django-session-security nützlich finden.

+2

Django-Session-Sicherheit ausprobiert. Installiert wie ein Kinderspiel, wirkt wie ein Zauber. Danke, dass du so ein wunderbares Modul gemacht hast! –

0

Set Sitzungszeit benötigt, bevor Login() aufrufen! Diese

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

funktioniert für mich

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 
9

Django 1.9

Bearbeiten Sie Ihre settings.py und folgendes hinzufügen:

# SESSION AGE 5 Minutes 
SESSION_COOKIE_AGE = 5*60 
+0

@shacker warum nicht? der Sitzungscookie wäre verloren, oder? – jjmontes

+1

Funktioniert perfekt auf Django 1.10;) Danke @Slipstream – Deadpool

Verwandte Themen