Django 应用程序的缓存和/或会话问题

Django 应用程序的缓存和/或会话问题

我们遇到了几个问题,用户退出和/或无法登录我们的 Django 应用程序。我们有一个数据库、多个前端服务器和一个使用 ip_hash 的 nginx 负载平衡器,并且遇到了两个问题,我不确定它们是否相关。

首先,如果用户的点击从一个前端服务器转移到另一个前端服务器(例如,如果一台服务器因维护而关闭),许多用户将被注销。只需使用标准 Django 数据库会话存储和身份验证包,这似乎不应该成为问题。

第二个是少数用户在登录时遇到问题。在他们通过身份验证后(并确认他们的 sessionid 与数据库中的用户匹配),站点将响应他们的请求,就好像他们未登录一样。他们可以尝试再次登录并获取新的会话 id,但仍然会像匿名一样获取页面。我无法复制此问题,因此很难进行更深入的测试。我不确定是不是 django 无法以某种方式识别会话,或者页面是否正在为他们缓存(已确认不是浏览器缓存)。主站点​​页面使用缓存控制标头提供:no-cache、max-age=0、must-revalidate,如果用户通过身份验证,django 应该提供重定向,但这并没有发生。

对于为什么会发生这种情况或者需要寻找什么,任何建议都值得赞赏。

答案1

看起来这应该可行。只需确认一下:您安装的应用程序中是否有 django.contrib.sessions?这将设置数据库支持的会话,因此您访问哪个前端都无所谓。

另一种可能性是,您错误地设置了 cookie。如果某人最终使用不同的前端机器,域名会反映这一点吗?例如,他们是否被重定向到 fe1.yourapp.com 或 fe2.yourapp.com,还是他们总是最终使用 www.yourapp.com?

我见过类似的情况,人们可以访问 yourapp.com 或 www.yourapp.com,但 Cookie 的设置不同 - 如果您先访问子域,则如果您稍后访问基域,您的 Cookie 将不会被传递。我们不太优雅的解决方案是将所有人重定向到 www 子域。

相关内容