Django会话超时问题

68bkxrlz  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(206)

我使用以下库实现了django-session-timeout。超时已配置为900秒。900秒的非活动状态后,将显示会话超时页面。我面临的问题是,每当用户打开第二次链接,会话超时页面显示。
假设:尚未清除早期会话中的Cookie。
我在页面加载之前尝试了request.session.flush(),但它不起作用。作为临时解决方案,用户被迫打开链接两次。需要一个永久的解决方案。

p5cysglq

p5cysglq1#

Django-session-timeout是一个相当简单的中间件。它实际上只有一个文件,您可以使用它作为您想要实现的内容的基础。看看file in question,看看它在做什么。你可以看到它已经使用了session.flush(),这样用户就不会看到页面两次,所以添加它对你的目标没有帮助。
此外,middlewhere在视图之前运行,因此如果存在过期的会话,则总是会发生重定向,而不管发生了多久。
需要说明的是,django默认情况下不会让你 * 自动 * 调出过期页面--它只会在你调用服务器时发生,例如,转到一个新页面,这样中间件就会被调用。目前,从django的Angular 来看,过期用户在20分钟后访问新页面和24小时后访问新页面没有区别。
听起来你想要实现的是这样的:
用户访问站点,休息15分钟,然后在下次使用站点时获得超时页面。
用户访问该网站,然后第二天访问。此用户应获得登录屏幕。
一种方法是决定过期的会话应在什么时候转到登录页面。让我们说你决定在到期后一小时。您可以修改中间件文件(或者,更好的是,将其用作your own middleware file的基础),并尝试以下操作(这是基于链接的中间件文件,不会单独工作):

...
    session_is_expired = time.time() - init_time > expire_seconds
    #create a new boolean variable to see if an hour has passed since expiry
    sesson_expired_hour_ago = time.time() - init_time > expire_seconds + 3600       

    
    if session_is_expired:
        #has it been less than an hour since the session expired
        if not session_expired_hour_ago:
            request.session.flush()
            redirect_url = getattr(settings, "SESSION_TIMEOUT_REDIRECT", None)
            if redirect_url:
                return redirect(redirect_url)
        #default expiry behaviour is return to login
        return redirect_to_login(next=request.path)

现在,用户将只看到过期的第一个小时的超时页面,以及之后的登录页面。

相关问题