【问题标题】:Django session cookie expiry dateDjango 会话 cookie 到期日期
【发布时间】:2017-12-02 03:34:32
【问题描述】:

我正在运行一个 django (1.10) 站点。在设置中,我定义了 SESSION_COOKIE_AGE = 60*60*24*365,它设置了 cookie 从创建后 1 年到期。

最近,会话在会话结束时到期。简而言之,也许会话到期没有设置,尽管它仍然像之前一样在设置中定义。

可能是什么问题。为什么不遵循默认行为。我在本地服务器、测试服务器和生产中都面临同样的问题。

我知道这个问题不清楚,因为我不知道问题的根源是什么。我想要的是将 sessionid cookie 的到期日期设置为从创建后一年。

任何指针都会有所帮助。

【问题讨论】:

    标签: django python-3.x cookies session-cookies


    【解决方案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,无论过期时间如何,它都会将会话设置为在浏览器关闭时过期。使用调试器或打印语句来检查该函数为何/是否返回 true。如果它没有返回 true,则可能是浏览器/配置问题。最后,您可以准确地看到 Django 在 set_cookie 函数中写出的内容。如果那里的一切看起来都不错,那么您的问题可能出在浏览器方面。

    【讨论】:

    • 我已经经历了这个,但仍然对为什么会发生这种情况感到困惑。此外,这不是浏览器问题,因为在其他系统上也会发生相同的行为。
    • 您安装了调试器吗?它是否达到了这些线: max_age = None expires = None 您应该能够确切地看到它设置它的原因。进入 get_expire_at_browser_close() 函数,看看它为什么返回 true。
    • @DhiaTN 嘿,我不得不更改 django 的源代码(这个文件)。问题似乎是当您在处理请求期间修改 cookie 时,它​​将到期日期设置为无。为简单起见,我只是暂时在 if else 条件之外定义了 cookie 到期日期。这只是一个临时解决方案。另外,也许这个问题在 django 1.11 中没有发生
    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 2022-10-04
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多