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