如果用户会话在某段时间内处于非活动状态,则终止该用户会话,并将其会话的开始和结束时间记录在数据库中

2024-04-19 09:50:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个Django后端应用程序,在这里我需要记录用户的活动,即他的登录时间和注销时间。如果他不活动超过30分钟,我希望用户自动注销,终止用户的会话,并将注销时间存储到一个表中。为此,我编写了一个模型,用户登录和用户注销信号以及一个中间件类。在

在模型.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 signal将用户登录时间存储在表UserActivities中,并将其id存储到会话键

^{pr2}$

logout视图,用于在用户只需注销并使会话过期时注销,并将注销时间存储在表

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

一旦用户在浏览器中的Cookie设置为“真”时关闭Cookie,则一旦用户关闭浏览器中的Cookie。如果希望用户每次打开浏览器时都必须登录,请使用此选项。它将使用户的会话过期。我能得到这个事件或者用户在django关闭浏览器的时间吗。在

告诉我完成这项任务的正确方法。谢谢你


Tags: instance用户idtruetimemodelsrequestsession
1条回答
网友
1楼 · 发布于 2024-04-19 09:50:00

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

相关问题 更多 >