如何在两个django应用程序之间共享会话?

时间:2016-03-29 09:07:24

标签: python django session cookies

我有两个django应用程序,它们位于端口809002上的同一台服务器上。即网址为www.abc.comwww.abc.com:9002 两者共享相同的数据库postgresql进行身份验证。我想在它们之间共享会话数据的共享,以便登录到一个应用程序的用户可以在另一个应用程序中自动登录。

我读了这些答案:Multiple Django apps, shared authenticationHow to get distinct Django apps on same subdomain to share session cookie?

在我的两个django应用程序中做到了这一点:

  1. 在两者中使用相同的密钥。
  2. 添加以下行:

    SESSION_ENGINE ='django.contrib.sessions.backends.signed_cookies' SESSION_COOKIE_NAME ='abc'
    SESSION_COOKIE_DOMAIN ='。abc.com'

  3. 但我仍然无法达到目的。 如何在两个django应用程序之间共享会话cookie,以便我可以进行共享身份验证?

1 个答案:

答案 0 :(得分:0)

除了必须将这些设置应用到两个应用程序之外, 您的方法唯一缺少的是SESSION_COOKIE_DOMAIN。

您将其设置为“ .abc.com”,这意味着如果您的应用具有域名www.abc.comsomesubdomain.abc.com,它将可以正常工作。

但是您的第二个应用程序在此情况下为www.abc.com:9002,因为包含了端口,它与www.abc.com没有共享相同的TLD。因此,django认为www.abc.com:9002www.abc.com是非常不同的域,而不是来自同一根.abc.com

如果我正在研究此方法,则有几种可能的方法:

  1. 将两个应用程序合并为一个根django应用程序。无论如何,Django应用都是模块化的,因此您可以创建一个单独的ROOT_URL_CONFDJANGO_SETTINGS_MODULE来指定这两个应用在相同域中的工作方式。例如,您可以为每个应用程序附加一个不同的前缀URL。

  2. 您使用负载平衡器或反向代理(例如nginx或haproxy)为每个应用程序分配不同的子域,然后将每个应用程序部署在不同的端口中。假设最终结果是您在first.abc.com上部署了第一个django应用程序,而在second.abc.com中部署了第二个应用程序(全部在前端使用端口80),那么它将共享相同的会话。只需记住,您需要在后端中分配应用程序使用的实际端口。

我的其他说明。在生产设置中,您还希望添加ALLOWED_HOSTS设置并将.abc.com包括在列表中。