1

有 2 个 django(相同版本,相同会话中间件)应用程序托管在同一域内的不同主机上,它们共享一个 redis 会话存储。

但是当我们尝试登录一个应用程序时,第二个应用程序永远不会获取会话数据。当 2 个 django 应用程序托管在同一主机上时,一切正常。我们尝试在 settings.py 中的两个应用程序上设置 SESSION_COOKIE_DOMAIN,但到目前为止没有任何成功。有没有人知道可能出了什么问题,或者给我一些关于如何在我的 2 个应用程序之间成功共享会话数据的线索?

下面是我们想要实现的小方案:

|------------------------------------|
| site1.domain.tld
|------------------------|
      |
      |
|-----------------------------|
| Redis 会话存储
|----------------------------|
      |
      |
|------------------------------------|
| site2.domain.tld
|------------------------|

注意:两个应用程序的 SESSION_COOKIE_DOMAIN 设置为“.domain.tld”,SECRET_KEY 也相同。

问候,

克莱门特。

4

1 回答 1

1

相当长的镜头,因为我不完全确定 redis 会话后端的内部工作原理,但是查看cache_key默认方法SessionStore及其_get_new_session_key调用的方法,可以假设正在为每个服务器计算一个唯一的缓存键.

django 文档明确指出

[...] 在服务器之间或在生产环境和开发环境之间共享缓存实例,一个服务器缓存的数据可能会被另一台服务器使用。

我建议您查看KEY_PREFIXandKEY_FUNCTION设置,也许在两个服务器配置中明确设置值会产生所需的效果。此外,通过查看 redis 会话存储的源代码,您可以深入了解它是否以及如何处理键前缀。

于 2015-05-18T14:50:44.503 回答