首页 文章

如果用户会话在一段时间内处于非活动状态并将其会话开始和结束时间记录在数据库中,则会使用户会话过期

提问于
浏览
1

我正在开发一个Django后端应用程序,我需要记录用户活动,即他的登录时间和注销时间 . 如果他处于非活动状态超过30分钟,我希望用户自动注销,使用户的会话到期并将注销时间存储到表中 . 为此,我写了一个模型,user_logged_in和user_logged_out信号以及一个Middleware类 .

models.py用于存储有关用户会话或登录和注销时间的信息

class UserActivities(models.Model):
user=models.ForeignKey(User)
login_time=models.DateTimeField(auto_now_add=True)
logout_time=models.DateTimeField(null=True)
activity_time=models.DecimalField(max_digits=8,decimal_places=2,null=True,default=0)

user_logged_in信号用于在UserActivities表中存储用户登录时间并将其id存储到会话密钥

def save_login_time(sender, user, request, **kwargs):
    try:
        user_activity_id=UserActivities.objects.create(user=request.user,
                                               login_time=request.user.last_login)
        request.session['user_activity_id']=user_activity_id.id
        request.session['last_request']=timezone.now()
    except:
        print " sorry user activity instance couldn't be created"
user_logged_in.connect(save_login_time)

注销视图,用于注销用户,如果他只是注销并使其会话到期并在表中存储注销时间

def logout_view(request):
    user_activity_id=request.session['user_activity_id']
    user_activity_instance=UserActivity.objects.get(id=user_activity_id)
    user_activity_instance.logout_time=timezone.now()
    user_activity_instance.activity_time=(timezone.now()-user_activity_instance.login_time).total_seconds()
    user_activity_instance.save()
    logout(request)
    return logout_then_login()

如果用户注销,那么这段代码很好用于注销用户的中间件类,如果用户处于非活动状态30分钟,则会使用户的会话失效

class UserLogOutMiddleware(object):
    def process_request(self, request):
        if 'last_request' in request.session:
            if (timezone.now()-request.session['last_request']).total_seconds()>=30000:
                user_activity=UserActivity.objects.get(id=request.session['user_id'])
                user_activity.logout_time=request.session['last_request']+timedelta(minutes=30)
                logout(request)
            else:
                    request.session['now']=timezone.now()
        return None

使用上面的代码我正在做的是当用户登录时我将当前时间分配给

request.session['last_request'] and  If the next request comes 
after 30 minutes of first request the user will be logged out or
timezone.now() will be request.session['last_request'].

我已经定了

SESSION_EXPIRE_AT_BROWSER_CLOSE=True

如文档中所示,如果SESSION_EXPIRE_AT_BROWSER_CLOSE设置为True,Django将使用浏览器长度的cookie - 一旦用户关闭其浏览器就会过期的cookie . 如果您希望人们每次打开浏览器时都必须登录,请使用此选项 . 它将使用户的会话到期 . 我可以在django中获取此事件或用户关闭浏览器的时间 .

告诉我,因为我做了它是完成这项任务的正确方法 . 谢谢

1 回答

  • 1

    作为一种变体,您可以设置一个JS计时器函数 setInterval(checkLogout, 10000) 并在 checkLogout 函数中每隔10秒(setInterval函数中的第二个参数,以ms为单位)请求任何url,该视图将是存储用户的登录时间,如果它将超过30分钟,将它们重定向到注销页面 .

相关问题