如何在5分钟内过期Django会话? [英] How to expire Django session in 5minutes?

查看:127
本文介绍了如何在5分钟内过期Django会话?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  def login_backend(request):
如果请求。方法=='POST':
username = request.POST ['username']
password = request.POST ['password']
user = authenticate(username = username,password = password )
如果用户不是无:
登录(请求,用户)
request.session.set_expiry(300)
返回HttpResponseRedirect('/ overview /')

return HttpResponseRedirect('/ login_backend /')
else:
return render_to_response('login_backend.html',context_instance = RequestContext(request))

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

解决方案

Django 1.6更新



由于json可序列化,以下中间件代码在Django 1.6及更高版本中不起作用。要使其在所有版本的Django中工作,请放入会话序列化程序。



settings.py

  #Handle会话不是Json可序列化
SESSION_SERIALIZER ='django.contrib.sessions.serializers.PickleSerializer'
/ pre>

上面的序列化示例是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):
如果没有request.user.is_authenticated():
#如果没有登录,则无法注销
返回

尝试:
如果datetime.now() - request.session ['last_touch']> timedelta(0,settings.AUTO_LOGOUT_DELAY * 60,0):
auth.logout(request)
del request.session ['last_touch']
return
除了KeyError:
pass

request.session ['last_touch'] = datetime.now()

更新您的 settings.py

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

'app_name.middleware.AutoLogout',
]

#自动注销延迟分钟
AUTO_LOGOUT_DELAY = 5#等于5分钟


I am using this to login the user in:

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

I want session to expire after 5mins thus I added request.session.set_expiry(300) in the view above. But the session is never expiring. What am I doing wrong?

解决方案

Update for Django 1.6

The middleware code below is not working in Django 1.6 and above version because of json serializable. To make it work in all versions of Django, put the session serializer.

settings.py

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

The above sample of serializer is for Django 1.6. Kindly search for other version. Thanks...

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

Update your settings.py:

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

    'app_name.middleware.AutoLogout', 
]

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

这篇关于如何在5分钟内过期Django会话?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆