2013-02-12 3 views
25

Я использую это для входа пользователя в систему:Как истечь сеанс Django в 5 минут?

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

Я хочу сессия истекает через 5 мин, таким образом, я добавил request.session.set_expiry(300) в вышеприведенном зрения. Но сеанс никогда не заканчивается. Что я делаю не так?

+0

Я уже ответить на этот же вопрос, вот ссылка http://stackoverflow.com/questions/14808238/middleware -is-не-работа ожидалось/14808426 # 14808426. Если у вас есть пояснения, просто скажите мне – catherine

+0

Если пользователь открывает приложение, я не хочу, чтобы сеанс истекал. Если пользователь не открыл приложение в течение 5 минут, я хочу, чтобы сеанс истекал. – pynovice

+0

Да, это так, вот мой ответ. Если пользователь находится в режиме ожидания, он автоматически выйдет из системы. Вы хотите, чтобы я опубликовал здесь весь ответ? – catherine

ответ

29

Обновление для Django 1.6

Промежуточного ниже код не работает в Django 1.6 и выше версий из JSON сериализуемого. Чтобы он работал во всех версиях Django, поместите сериализатор сеанса.

settings.py

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

выше образец сериализатором для Django 1.6. Просьба искать другую версию. Спасибо ...

Создать 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() 

Обновить свой settings.py:

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

    'app_name.middleware.AutoLogout', 
] 

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

Это не работает с django 1.6, хотя :( – Hec

+0

@hec будет работать, если вы установите параметр для сеансового сериализатора, который исправит ', не json serializable' – catherine

+0

Или вы можете изменить время datetime.now() на время. time(). Сделайте другие небольшие релевантные изменения в логике условий, и он работает на сериализаторе JSON. – Hec

27

Это два параметра для истечения сеансов, SESSION_EXPIRE_AT_BROWSER_CLOSE и SESSION_COOKIE_AGE. Если вы хотите истекает через 5 минут настройки Yours хотел как:

SESSION_EXPIRE_AT_BROWSER_CLOSE = False 
SESSION_COOKIE_AGE = 5 * 60 # 

Чтобы объединить и узнать, как сделать это написание пользовательского ПО промежуточного "Is there a way to combine behavior of SESSION_EXPIRE_AT_BROWSER_CLOSE and SESSION_COOKIE_AGE"

+0

Если пользователь открывает приложение, я не хочу, чтобы сеанс истекал. Если пользователь не открыл приложение в течение 5 минут, я хочу, чтобы сеанс истекал. – pynovice

+0

Обратите внимание, что мой код промежуточного кода проверяет request.user.is_authenticated(). – danihp

11

В зависимости от вашего проекта, это может быть не достаточно.

Например, если пользователь тратит 6 минут на заполнение формы и нажимает «Сохранить»? Браузер будет перенаправлен на страницу входа в систему, и данные формы будут потеряны.

Кроме того, существует потенциальная проблема безопасности, если пользователь покидает свою рабочую станцию ​​с конфиденциальными данными на открытой странице браузера.

Кроме того, что, если пользователь читает страницу в течение 6 минут? Тогда не здорово вывести его из системы без предупреждения или каким-либо образом продлить его сессию ...

Учитывая это, вы можете найти django-session-security.

+2

Пробовал django-session-security. Устанавливается, как ветер, работает как шарм. Спасибо, что создали такой замечательный модуль! –

0

Установить время сеанса, необходимое перед вызовом входа (!)

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

Это работает для меня

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

Джанго 1.9

Корректировать settings.py и добавьте следующее:

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

@shacker почему бы и нет? cookie сессии будет потерян, не так ли? – jjmontes

+1

Отлично работает на Django 1.10;) Спасибо @Slipstream – Deadpool

Смежные вопросы