Подтвердить что ты не робот

Как закончить сеанс 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) в приведенном выше представлении. Но сеанс никогда не заканчивается. Что я делаю неправильно?

4b9b3361

Ответ 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