我正在运行一个django(1.10)网站。在设置中,我定义了SESSION_COOKIE_AGE = 60*60*24*365
,并且它设置了从创建起1年后的Cookie到期时间。
最近,会议将在会议结束时到期。简单地说,虽然它仍然在早期的设置中定义,但是可能没有设置会话到期。
可能是什么问题。为什么不遵循默认行为。我在本地服务器,测试服务器和生产中面临同样的问题。
我理解这个问题并不清楚,因为我不知道问题的根源是什么。我想要的是将sessionid cookie的到期日期设置为创建后的一年。
任何指针都会有所帮助。
答案 0 :(得分:1)
该代码发生在/django/contrib/sessions/middleware.py
。您可以在此代码块中看到正在发生的事情:
if (modified or settings.SESSION_SAVE_EVERY_REQUEST) and not empty:
if request.session.get_expire_at_browser_close():
max_age = None
expires = None
else:
max_age = request.session.get_expiry_age()
expires_time = time.time() + max_age
expires = cookie_date(expires_time)
# Save the session data and refresh the client cookie.
# Skip session save for 500 responses, refs #3881.
if response.status_code != 500:
try:
request.session.save()
except UpdateError:
raise SuspiciousOperation(
"The request's session was deleted before the "
"request completed. The user may have logged "
"out in a concurrent request, for example."
)
response.set_cookie(
settings.SESSION_COOKIE_NAME,
request.session.session_key, max_age=max_age,
expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,
path=settings.SESSION_COOKIE_PATH,
secure=settings.SESSION_COOKIE_SECURE or None,
httponly=settings.SESSION_COOKIE_HTTPONLY or None,
)
如果get_expire_at_browser_close()
返回true,则无论过期年龄如何,它都会在浏览器关闭时将会话设置为过期。使用调试器或print语句来检查该函数返回true的原因。如果它没有返回true,则可能是浏览器/配置问题。你可以看到Django最后在set_cookie函数中写出了什么。如果一切看起来都不错,那么您的问题可能就在浏览器端。