Python 如何在django中查找会话是否已过期

Python 如何在django中查找会话是否已过期,python,jquery,django,session-cookies,Python,Jquery,Django,Session Cookies,我必须为这个场景编写代码: 一些用户来填写表单,当用户在填写表单时,会话将过期; 用户尝试提交表单,因为会话已过期,他将进入登录页面,之后他将被重新编辑到表单页面,并使用他先前填写的数据预先填写表单 我提出的解决方案: 在表单提交时,通过ajax调用检查用户会话是否过期,如果是,则删除一个具有填充表单值的cookie,用户返回到同一表单,从cookie值中预填充表单 我走了多远: 不多我使用ajax调用检查会话到期时间,并对该函数进行后端调用: def check_valid_session(r

我必须为这个场景编写代码:

一些用户来填写表单,当用户在填写表单时,会话将过期; 用户尝试提交表单,因为会话已过期,他将进入登录页面,之后他将被重新编辑到表单页面,并使用他先前填写的数据预先填写表单

我提出的解决方案: 在表单提交时,通过ajax调用检查用户会话是否过期,如果是,则删除一个具有填充表单值的cookie,用户返回到同一表单,从cookie值中预填充表单

我走了多远: 不多我使用ajax调用检查会话到期时间,并对该函数进行后端调用:

def check_valid_session(request):
    session_expiry_date = request.session.get_expiry_date()
    now = datetime.now()
    seconds_left = (session_expiry_date - now).total_seconds()
    if seconds_left <= 0:
        return JsonResponse({'session_expired': True, 'seconds_left': seconds_left })
    else:
        return JsonResponse({'session_expired':False, 'seconds_left': seconds_left})
但作为回应,我总是得到接近9.999秒的秒数。 每次我点击提交并调用上面的后端代码时,session_expiration_date会自动增加10秒。 如何获得正确的会话过期时间?有其他的方法吗

您可以尝试设置

SESSION\u SAVE\u EVERY\u REQUEST=True


这将在每次请求时将会话保存到数据库中。此外,cookie将随每个请求一起发送。

因此,这里发生的情况是,对check\u valid\u会话视图的连续请求正在将cookie的时间刷新到从上次请求开始的10秒。cookie只有在上次请求后10秒才在您的情况下过期

因为您必须发出请求才能获得cookie到期,所以每次都会返回接近10的值

至于如果用户的会话已过期,则使用cookie保存用户数据的问题。如果没有会话数据,您如何知道哪个用户正在发出请求?我能想到的唯一一件事就是用他们的关联ip地址保存他们的post数据。虽然这肯定会使问题过于复杂,从安全角度来看也不太好,因为如果其他用户使用相同的ip发出请求,他们可能会看到此帖子数据


最简单的解决方案是增加会话的超时时间。10秒非常短,会话时间的默认值为1209600(2周,以秒为单位)

您知道如何查找会话是否已过期吗?request.session.get_Expirement_age()--实际上不返回会话到期前还剩多少秒。它只给出我们在request.session.set\u expiration(10)中设置的内容。
SESSION_COOKIE_NAME = "sso-sessionid"
SESSION_COOKIE_HTTPONLY = False
SESSION_COOKIE_AGE = 10 
SESSION_COOKIE_DOMAIN = '.mydomain.com'
SESSION_COOKIE_SECURE = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True