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

12
我有两个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应用程序中使用了相同的密钥,并添加了以下行:
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' SESSION_COOKIE_NAME = 'abc'
SESSION_COOKIE_DOMAIN = '.abc.com'
但是我仍然无法实现目标。如何在两个Django应用程序之间共享会话cookie,以便我可以实现共享身份验证?

你在这个问题上有任何进展了吗? - Luis Alberto Santana
1
你可以尝试单点登录。在我的情况下,我合并了两个应用程序,并通过标志定义了各自的页面访问权限。 - Manish Gupta
这两个 Django 应用程序是否在同一个 Django 项目中?考虑到 Django 管理界面,它是与您的应用程序不同的应用程序。如果您在其中一个应用程序中使用了 Django 认证,一旦登录,您也可以访问另一个应用程序(如果该用户有权访问 Django 管理界面)。 - PaK-Zer0
使用 JSON WEB TOKENS。 - Eddwin Paz
1个回答

3
除了您必须将这些设置应用于两个应用程序之外,您的方法中唯一缺失的是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包含在列表中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接