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

Posted

技术标签:

【中文标题】如何在两个 django 应用程序之间共享会话?【英文标题】:How to share session between two django application? 【发布时间】:2016-07-16 17:57:42 【问题描述】:

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

我阅读了这些答案:Multiple Django apps, shared authentication 和 How 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,以便我可以共享身份验证?

【问题讨论】:

您在这个问题上取得了进展吗? 你不妨试试单点登录。就我而言,我合并了两个应用程序并通过标志定义了单个页面访问。 这两个 django 应用程序是否在同一个 django 项目中?想想 django 管理员,它与您的应用程序不同,如果您使用 django auth 一旦登录其中一个,您还可以访问另一个(如果相关用户有权访问 django 管理员) 使用 JSON WEB TOKENS.. 【参考方案1】:

除了您必须将这些设置应用于两个应用程序之外, 您的方法唯一缺少的是 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

如果我正在处理这个问题,有几种可能的方法:

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

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

我的补充说明。在生产设置中,您还需要添加ALLOWED_HOSTS 设置并将.abc.com 包含在列表中。

【讨论】:

以上是关于如何在两个 django 应用程序之间共享会话?的主要内容,如果未能解决你的问题,请参考以下文章

在两个烧瓶服务器之间共享会话

两个域之间的会话共享

如何在 Spring Security 中的子域之间共享会话

在两个不同的 Web 浏览器之间共享会话

会话在本地主机上的两个 Flask 应用程序之间共享

2个托管服务器之间的共享会话