Python / Django 多租户解决方案

13

我需要一些帮助来制定一个项目攻略。

想象一下,这个站点是为一个分布在全球的区域销售办事处监管团体而设计的。这个项目的目的是让超级用户快速启动针对每个办事处的全新子站点——站点会经常被添加。办事处子站点应该完全包含特定于该子站点的“管理员”用户,并且应该是易于使用的CMS。超级用户应该能够进入并管理所有这些办事处子站点。

除了自包含的办事处子站点实例之外,还需要每个子站点来管理联系人、潜在客户等信息,并将其存储在一个集中的区域供超级用户使用。

我做过几个使用Django的站点,但从未做过任何多租户的站点。我想寻求建议,以便使用哪些技术或有哪些教程/文档可能会有所帮助。

要求:

  1. 每个子站点使用相同的源(模板、JS、可用功能等),但可以修改以反映模板中的自定义内容。
  2. 为每个子站点分配子域名(选项为使用完全限定域),配置在项目内,而不是在硬编码的设置文件中。
  3. 子站点特定的用户访问控制,除了可以访问所有子站点的超级用户之外。
  4. 为每个子站点提供“独立”的CMS的能力。即,子站点管理员仅看到他们的内容。我对这个项目的偏好是django-cms,但我也愿意考虑其他选择。
  5. 支持从所有子站点汇集数据的应用程序,但限制子站点“管理员”仅查看其记录。

考虑上述需求,您会推荐哪种方法?我愿意重新考虑技术,但我想坚持使用Python。

4个回答

13
有一个很棒的应用程序叫做 django-tenant-schemas,它使用 PostgreSQL 模式机制来创建多租户。
您需要指定包含所有模式(子站点)共享对象的SHARED_APPS,以及包含特定于子站点的对象的TENANT_APPS,例如用户、记录等。这些模式完全彼此隔离。
每个 PostgreSQL 模式都与域 URL 绑定,因此中间件检查请求的HOST部分,并将 db 连接的模式设置为适当的模式。
此外,它允许您定义PUBLIC_SCHEMA_URLCONF,使您可以为公共模式(不绑定到任何子站点的元站点)指定 urlconf 文件。

1
谢谢您的快速回复!我研究了django-tenant-schemas,但卡住的一件事是它似乎没有提供任何有关认证方面的帮助(这方面我经验不足)。创建一个只能访问特定子站点的角色或组是否困难? - kotyy
如果您指的是一个用户组或角色,使得该组/角色中的用户可以访问定义的子站点,那么您需要将SiteUser模型共享到所有模式(即public)中,对于每个允许的模式,它都包含模式内用户模型的ID。否则,您可以只共享User模型,并在另一个中间件/自定义身份验证后端中处理身份验证。 - Maciej Gol
1
Django-tenant-schemas是否存在安全风险?用户是否可以查看其模式之外的数据? - Greg

5

很抱歉回答得有些匆忙,我只是分享了一下我为实现多租户所做的事情:

以上两个库结合起来,可以提供一个多租户、灵活的Django实例。在这里灵活的意思是:您可以定义任何模型,无论是“租户”还是“全局”。因此,您可以拥有一个具有全局用户但每个租户产品目录或每个租户+产品的网站。从我尝试过的许多Django应用程序中,这是实现多租户最灵活的方式。


3
基于Django的CMS Mezzanine 也有多租户支持。它具有你所需的大部分功能,但我认为缺少子站点用户控制。管理员页面可以按网站分离,但普通用户则不能。然而,如果不需要CMS,则这可能会对你的用例过于复杂。但为了完整起见,在此提及它。

0

我一直在尝试使用django-tenants和Wagtail,但这个组合并不是很好用。或者说,尽管我尝试了很多次,但我仍然无法正确地让wagtail管理页面正常工作。我想我会尝试切换到更广泛使用的django-tenant-schemas

注意:django-tenant-schemas现在已经不再维护。


1
django-tenant-schemas不再维护... django-tenants从它进行了分支并正在积极维护...因此我不建议转移到django-tenant-schemas。 - Abdullah
我自2016年以来就没有使用过Django,所以这整个线程现在都已经过时了。现在任何人阅读这个应该去看看github上的“django-multitenant”项目或者viget.com上的“Django中的多租户”博客文章。 - kotyy

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