Как закончить сеанс 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)
в приведенном выше представлении. Но сеанс никогда не заканчивается. Что я делаю неправильно?
Ответы
Ответ 1
Обновление для 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
Ответ 2
Есть два параметра для истечения сеансов: SESSION_EXPIRE_AT_BROWSER_CLOSE и SESSION_COOKIE_AGE.
Если вы хотите истечь через 5 минут, ваши настройки должны выглядеть следующим образом:
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_COOKIE_AGE = 5 * 60 #
Чтобы объединить и научиться писать свое собственное промежуточное ПО "Есть ли способ объединить поведение SESSION_EXPIRE_AT_BROWSER_CLOSE и SESSION_COOKIE_AGE"
Ответ 3
Django 1.9
Измените свой settings.py и добавьте следующее:
# SESSION AGE 5 Minutes
SESSION_COOKIE_AGE = 5*60
Ответ 4
В зависимости от вашего проекта этого может быть недостаточно.
Например, что, если пользователь тратит 6 минут на заполнение формы и нажимает "Сохранить"? Браузер будет перенаправлен на страницу входа в систему, и данные формы будут потеряны.
Кроме того, существует потенциальная проблема безопасности, если пользователь покидает свою рабочую станцию с конфиденциальными данными на открытой странице браузера.
Кроме того, что, если пользователь читает страницу в течение 6 минут? Тогда не здорово вывести его из системы без предупреждения или каким-либо образом продлить его сеанс...
Учитывая эти вопросы, вы можете найти django-session-security.
Ответ 5
Я использую Django 2.1.7, и самый простой способ завершить сеанс django:
сначала вам нужно установить django-session-timeout с помощью команды:
pip install django-session-timeout
чем вам нужно обновить SessionTimeoutMiddleware в settings.py
MIDDLEWARE_CLASSES = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
'django_session_timeout.middleware.SessionTimeoutMiddleware',
...
]
наконец вам нужно добавить SESSION_EXPIRE_SECONDS в конце settings.py:
SESSION_EXPIRE_SECONDS = 300 # 300 seconds = 5 minutes
По умолчанию сессия истекает через X секунд после начала сессии. Чтобы истечь сеанс через X секунд после последнего действия, используйте следующий параметр:
SESSION_EXPIRE_AFTER_LAST_ACTIVITY = True
Ответ 6
Задайте время сеанса, необходимое для вызова login()!
...
request.session.set_expiry(300)
login(request, user)
...
Ответ 7
Это работает для меня
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