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

Posted

技术标签:

【中文标题】如何在同一子域上获取不同的 Django 应用程序以共享会话 cookie?【英文标题】:How to get distinct Django apps on same subdomain to share session cookie? 【发布时间】:2010-10-08 02:23:54 【问题描述】:

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

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

我挖掘了 Django 会话代码,发现:

django.conf.settings.SECRET_KEY

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

有没有办法做到这一点?我还缺少其他东西吗?

提前致谢

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

这是一个很好的建议——我会试一试。对于 SSO,这些是与负责 php 会话中的身份验证的旧 PHP 应用程序集成的内部应用程序,因此这不应该成为问题。在这一点上,我真的只需要 Django 应用程序不要踩到彼此的会话。谢谢 这成功了。现在我觉得我自己没有考虑到它有点傻:)【参考方案2】:

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

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

说了这么多,我还没有真正尝试过,所以你可能仍然有麻烦!

【讨论】:

假设有两个独立的数据库/模型,我猜,还需要在两个项目中克隆用户模型并始终保持同步。在检索用户实例或修改它们时,手动选择相同的数据库(使用=...)很重要。用户数据库表将在两个项目中创建,但实际上只有一个会填充数据。只是想想这个问题……你同意吗?

以上是关于如何在同一子域上获取不同的 Django 应用程序以共享会话 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同子域之间共享本地存储?

从同一主机上的子域访问时未找到 WCF 错误

使用 nginx 部署 django 并在云上做出反应

单个服务器上的多个子域。码头工人 + NGINX @ EC2

在多个子域上共享 Django 会话的缺点

301 在 Django 中重定向 www 子域