如何在5分钟内过期Django会话?

pyn*_*ice 40 django session

我用它来登录用户:

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))
Run Code Online (Sandbox Code Playgroud)

我希望会话在5分钟后过期,因此我request.session.set_expiry(300)在上面的视图中添加了.但会议永远不会到期.我究竟做错了什么?

dan*_*era 44

有两个参数到期会议,SESSION_EXPIRE_AT_BROWSER_CLOSE和SESSION_COOKIE_AGE.如果您想在5分钟后过期,您的设置应如下:

SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_COOKIE_AGE = 5 * 60 #
Run Code Online (Sandbox Code Playgroud)

要结合两者,学习如何编写自定义中间件"有没有办法结合SESSION_EXPIRE_AT_BROWSER_CLOSE和SESSION_COOKIE_AGE的行为"


cat*_*ine 35

Django 1.6的更新

由于json可序列化,下面的中间件代码在Django 1.6及更高版本中不起作用.为了使它在所有版本的Django中工作,请放置会话序列化程序.

settings.py

#Handle session is not Json Serializable
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
Run Code Online (Sandbox Code Playgroud)

上面的序列化器示例适用于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()
Run Code Online (Sandbox Code Playgroud)

更新您的settings.py:

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

    'app_name.middleware.AutoLogout', 
]

# Auto logout delay in minutes
AUTO_LOGOUT_DELAY = 5 #equivalent to 5 minutes
Run Code Online (Sandbox Code Playgroud)


Sli*_*eam 15

Django 1.9

编辑您的settings.py并添加以下内容:

# SESSION AGE 5 Minutes
SESSION_COOKIE_AGE = 5*60
Run Code Online (Sandbox Code Playgroud)

  • 在 Django 1.10 上完美运行;) 谢谢@Slipstream (2认同)

jpi*_*pic 14

根据您的项目,这可能还不够.

例如,如果用户花费6分钟填写表单并单击"保存",该怎么办?浏览器将重定向到登录页面,表单数据将丢失.

此外,如果用户将其机密数据留在浏览器的打开页面中,则存在潜在的安全问题.

另外,如果用户在6分钟内阅读页面怎么办?如果没有任何警告或以任何方式延长他的会话,他就不是很酷.

考虑到这些问题,您可能会发现django-session-security非常有用.

  • 试过django-session-security.像微风一样安装,就像一个魅力.感谢您制作如此精彩的模块! (3认同)

Mih*_*chl 6

我使用 Django 2.1.7 并且使 Django 会话过期的最简单方法是:

  • 首先,您需要使用以下命令安装 django-session-timeout:

    pip install django-session-timeout

  • 比你需要在 settings.py 中更新你的 SessionTimeoutMiddleware

    MIDDLEWARE_CLASSES = [ ... 'django.contrib.sessions.middleware.SessionMiddleware', 'django_session_timeout.middleware.SessionTimeoutMiddleware', ... ]

  • 最后你需要在settings.py的末尾添加SESSION_EXPIRE_SECONDS:

    SESSION_EXPIRE_SECONDS = 300 # 300 seconds = 5 minutes

默认情况下,会话将在会话开始后 X 秒到期。要在最后一次活动后 X 秒到期会话,请使用以下设置:

SESSION_EXPIRE_AFTER_LAST_ACTIVITY = True


小智 5

在调用 login() 之前设置所需的会话时间!

...
request.session.set_expiry(300)
login(request, user)
...     
Run Code Online (Sandbox Code Playgroud)

  • 似乎也以其他顺序运作——2022 年,8 年后...... (2认同)