python - 如果用户在一段时间内不活动,则使用户 session 过期,并在数据库中记录其 session 开始和结束时间

标签 python django django-models django-templates django-views

我正在开发一个 Django 后端应用程序,我需要记录用户事件,即他的登录时间和注销时间。如果他不活动超过 30 分钟,我希望用户自动注销,使用户 session 过期并将注销时间存储到表中。为此,我编写了一个 model 、 user_logged_in 和 user_logged_out 信号以及一个 Middleware 类。

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

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 存储到 session key

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)

注销 View ,如果用户只是注销并过期 session 并将注销时间存储在表中,则注销用户

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 分钟,则用于注销用户并使用户 session 过期的中间件类
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就会过期。如果您希望人们每次打开浏览器时都必须登录,请使用此选项。它将使用户的 session 过期。我可以在 django 中获取此事件或用户关闭浏览器的时间吗?

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

最佳答案

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

关于python - 如果用户在一段时间内不活动,则使用户 session 过期,并在数据库中记录其 session 开始和结束时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20143810/

相关文章:

python - Django:属性和查询集注释之间的重复逻辑

python - Django:使用相关模型中的 archive_index 和 date_field

python - Django:按*仅*年份值过滤日期时间字段?

python - 如何解决django中的两个模型循环依赖

django - 在 Django 中向多对多关系添加记录的正确方法

python - 使用numpy构建两个数组的所有组合的数组

python - 如何在Python中合并标题列?

Python dateutil.rrule 非常慢

python - 重复信息

django - 如何在已经守护进程的 Celery 进程中更改我的 CELERY_BROKER_URL?