代码之家  ›  专栏  ›  技术社区  ›  Joe Holloway

如何在同一子域上获得不同的django应用程序来共享会话cookie?

  •  7
  • Joe Holloway  · 技术社区  · 16 年前

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

    除了在一个复杂的工作流中,我很少使用django会话表。如果用户在此工作流中在应用程序之间来回切换,则会丢失会话并必须重新启动。

    我仔细研究了django会话代码,发现:

    django.conf.settings.secret_键

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

    有办法吗?我还缺什么吗?

    提前谢谢

    2 回复  |  直到 16 年前
        1
  •  15
  •   AdamKG    16 年前

    我建议你改一下 SESSION_COOKIE_NAME 不同的 两个应用程序的值。您的用户最初仍然需要登录两次,但他们的会话不会发生冲突-如果他们登录到应用程序A,然后再登录到应用程序B,然后返回到A,他们的A会话仍然存在。

    在Django实例之间共享会话可能不是一个好主意。如果你想要一种单一的登录方式,可以看看像Django-Cas这样的东西。您仍然有两个会话(您应该这样做),但用户只会登录一次。

        2
  •  8
  •   zellyn    16 年前

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

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

    尽管如此,我还没有尝试过所有这些,所以你可能仍然有麻烦!