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

新手上路,请多包涵

我正在使用它来登录用户:

 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) 。但是会话永远不会过期。我究竟做错了什么?

原文由 pynovice 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 368
2 个回答

Django 1.6 更新

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

设置.py

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

上面的序列化程序示例适用于 Django 1.6。请搜索其他版本。谢谢…

创建 中间件.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

原文由 catherine 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题