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

Python 如果用户会话在一段时间内处于非活动状态,则终止该会话,并在数据库中记录其会话开始和结束时间,python,django,django-models,django-templates,django-views,Python,Django,Django Models,Django Templates,Django Views,我正在开发一个Django后端应用程序,我需要记录用户的活动,即他的登录时间和注销时间。如果他处于非活动状态超过30分钟,我希望用户自动注销,使用户的会话过期,并将注销时间存储到表中。为此,我编写了一个模型,用户登录和用户注销信号以及一个中间件类 models.py用于存储有关用户会话或登录和注销时间的信息 用户登录信号,用于将用户登录时间存储在UserActivities表中,并将其id存储到会话密钥中 logout视图,用于注销用户,前提是用户只是注销并使其会话过期,并在表中存储注销时间 如

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

models.py用于存储有关用户会话或登录和注销时间的信息 用户登录信号,用于将用户登录时间存储在UserActivities表中,并将其id存储到会话密钥中 logout视图,用于注销用户,前提是用户只是注销并使其会话过期,并在表中存储注销时间 如果用户确实注销,则此代码可以 中间件类,用于注销用户并在用户处于非活动状态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'].  
我已经准备好了 如文档中所述,如果在浏览器关闭时会话过期设置为True,Django将使用浏览器长度的cookies–cookies在用户关闭浏览器时立即过期。如果您希望人们在每次打开浏览器时都必须登录,请使用此选项。它将使用户的会话过期。我可以获取此事件或用户在django中关闭浏览器的时间吗


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

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

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

谢谢你,格雷格,我写的东西对我来说很好。如果30分钟后收到请求,它将注销用户并将其重定向到登录页面。这不是一个正确的方法吗?我的主要问题是关闭浏览器上的事件。我试图发送一个请求文档。close(function(){}),但我想以python的方式发送。谢谢Greg,我写的东西对我来说很好。如果30分钟后收到请求,它将注销用户并将其重定向到登录页面。这不是一个正确的方法吗?我的主要问题是关闭浏览器上的事件。我试图发送一个请求文档.close(function(){}),但我想以pythonic的方式发送。
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
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