如何在两个 django 应用程序之间共享会话?
Posted
技术标签:
【中文标题】如何在两个 django 应用程序之间共享会话?【英文标题】:How to share session between two django application? 【发布时间】:2016-07-16 17:57:42 【问题描述】:我有两个 django 应用程序,它们位于同一服务器上的端口 80
和 9002
。即网址是www.abc.com
和www.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.com
和 somesubdomain.abc.com
,它将起作用。
但在这种情况下,您的第二个应用程序 www.abc.com:9002
,通过包含它不与 www.abc.com
共享相同 TLD 的端口。所以,django 认为 www.abc.com:9002
和 www.abc.com
是非常不同的域,而不是来自同一个根 .abc.com
。
如果我正在处理这个问题,有几种可能的方法:
将两个应用程序合并为一个根 django 应用程序。无论如何,Django 应用程序都是模块化的,因此您可以创建一个 ROOT_URL_CONF
和 DJANGO_SETTINGS_MODULE
来指定这两个应用程序如何在同一个域中工作。例如,您可以为每个应用附加不同的前缀 url。
您使用负载均衡器或反向代理(例如 nginx 或 haproxy)为每个应用程序分配不同的子域,然后将每个应用程序部署在不同的端口中。比方说,最终结果是您在first.abc.com
上部署了第一个django 应用程序,在second.abc.com
上部署了第二个应用程序(都在前端使用端口80),那么它将共享同一个会话。请记住,您需要在后端分配应用使用的实际端口。
我的补充说明。在生产设置中,您还需要添加ALLOWED_HOSTS
设置并将.abc.com
包含在列表中。
【讨论】:
以上是关于如何在两个 django 应用程序之间共享会话?的主要内容,如果未能解决你的问题,请参考以下文章