如何让同一子域上的不同 Django 应用程序共享会话 cookie?

问题描述 投票:0回答:2

我们在同一个子域上部署了几个 Django 应用程序。一些高级用户需要在这些应用程序之间跳转。我注意到每次他们在应用程序之间跳转时,他们的会话 cookie 都会从 Django 收到一个新的会话 ID。

除了一个复杂的工作流程之外,我很少使用 Django 会话表。如果用户在此工作流程中在应用程序之间切换,他们就会丢失会话并必须重新开始。

我深入研究了 Django 会话代码并发现:

django.conf.settings.SECRET_KEY

用于对每个请求的会话执行完整性检查。如果完整性检查失败,则会创建一个新会话。意识到这一点,我更改了每个应用程序中的密钥以使用相同的值,认为这将允许完整性检查通过并允许它们共享 Django 会话。然而,这似乎不起作用。

有办法做到这一点吗?我还漏掉了什么吗?

提前致谢

python django deployment session cookies
2个回答
19
投票

我建议您将两个应用程序的

SESSION_COOKIE_NAME
设置为 不同 值。您的用户最初仍需要登录两次,但他们的会话不会冲突 - 如果他们登录应用程序 A,然后登录应用程序 B,然后返回 A,他们仍将拥有 A 会话。

在 Django 实例之间共享会话可能不是一个好主意。如果您想要某种单点登录,请研究 django-cas 之类的东西。您仍然会有 2 个会话(正如您应该的那样),但用户只会登录一次。


9
投票

我同意在 Django 实例之间共享会话可能不是一个好主意。如果你真的愿意,你可以:

  • 确保两个 django 应用程序共享相同的 SECRET_KEY
  • 确保两个 Django 应用程序共享相同的 SESSION_COOKIE_NAME
  • 确保 SESSION_COOKIE_DOMAIN 设置为允许两个实例共享 cookie 的值。 (如果它们确实共享相同的子域,则您当前的设置可能没问题。)
  • 确保两个 Django 实例使用相同的会话后端(相同的数据库、相同的文件目录、相同的 memcached 配置等)
  • 确保放入会话中的任何内容在两个 Django 数据库中都有意义:至少,这将包括用户 ID,因为 Django auth 使用它来记住哪个用户已登录。

尽管如此,我还没有真正尝试过所有这些,所以您可能仍然遇到麻烦!

© www.soinside.com 2019 - 2024. All rights reserved.