Python / Django 多租户解决方案

Posted

技术标签:

【中文标题】Python / Django 多租户解决方案【英文标题】:Python / Django multi-tenancy solution 【发布时间】:2013-10-14 08:59:11 【问题描述】:

我可以帮助我为我正在进行的项目制定攻击计划。

想象一下,该网站是为一个负责监督分布在世界各地的区域销售办事处的团队准备的。该项目的目的是让超级用户快速启动一个特定于每个办公室的新子站点——站点会频繁添加。办公室子站点应该完全包含特定于该子站点的“管理员”用户,并且应该是用户友好的 CMS。超级用户应该能够介入和管理所有这些办公室子站点。

除了独立的办公室子站点实例之外,每个子站点还需要管理联系人、潜在客户等,并将其存储在一个中心区域供超级用户使用。

我已经使用 Django 完成了一些站点,但从来没有使用多租户。我想要对使用的技术或可能有用的教程/文档提出建议。

要求:

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

考虑到上述情况,您会推荐什么方法?我愿意重新考虑技术,但我想坚持使用 Python。

【问题讨论】:

【参考方案1】:

我一直在尝试将django-tenants 与 Wagtail 一起使用,但这种组合效果不佳,或者让我说,尽管尝试了很多,但我还是无法让 wagtail 管理页面正常工作正确。 我想会尝试切换到我更广泛使用的django-tenant-schemas

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

【讨论】:

django-tenant-schemas 不再被维护.... /跨度> 自 2016 年以来我就没有使用过 Django,所以此时整个线程已经过时了。现在阅读本文的任何人都应该查看 github 上的“django-multitenant”项目或来自 viget.com 的“Multi-Tenancy in Django”博客文章【参考方案2】:

基于 Django 的 CMS Mezzanine 也有 multi-tenancy support。

除了我认为的子站点用户控件之外,它具有您要求的大部分功能。管理员页面可以按站点对管理员用户进行分隔,但普通用户不能。

但是,如果您不需要 CMS,这对您的用例来说可能有点矫枉过正,但为了完整起见,我想在这里提及它。

【讨论】:

【参考方案3】:

抱歉快速而肮脏的回答,我只是分享我为实现多租户所做的工作:

django-tenancy我喜欢作者使用“动态模型”的方法 django-dynamicsite 这是基于域的动态 SITE_ID 将链接到租户的位置

以上两个库在结合使用时,能够为多租户且灵活的 django 实例提供服务。我在这里灵活的意思是:您可以定义 any 模型,无论它是“租户”还是“全局”。因此,您可以拥有一个具有全局用户但每个租户产品目录或每个租户 + 产品的站点。从我尝试过的许多 django 应用程序中,这是实现多租户的最灵活方式

【讨论】:

【参考方案4】:

有一个很棒的应用程序叫做django-tenant-schemas,它使用 PostgreSQL 模式机制来创建多租户。

您得到的是指定 SHARED_APPS 包含在所有架构(子站点)之间共享的对象,以及 TENANT_APPS 包含特定于子站点的对象,即用户、记录等。架构是完全隔离的彼此之间。

每个 PostgreSQL 架构都绑定到一个域 url,因此中间件会检查请求的 HOST 部分并将数据库连接的架构设置为适当的。

此外,它允许您定义一个PUBLIC_SCHEMA_URLCONF,它允许您为 public 架构指定 urlconf 文件 - 不与任何子站点绑定的元站点。

【讨论】:

感谢您的快速答复!我查看了 django-tenant-schemas,但我被挂断的一件事是它似乎没有在事情的 auth 方面提供任何帮助(我对此不是很有经验)。创建一个仅限于特定子站点的角色或组会不会很困难? 如果您的意思是一个用户组或角色,它可以让该组/角色中的用户访问定义的子站点,那么您必须让 SiteUser 模型在所有模式之间共享(即public one),对于每个允许的模式,它将包含模式内用户模型的ID。否则,您可以只共享 User 模型,并在另一个中间件/自定义身份验证后端处理身份验证。 django-tenant-schemas 是否存在安全风险?用户可以查看其架构之外的数据吗?

以上是关于Python / Django 多租户解决方案的主要内容,如果未能解决你的问题,请参考以下文章

如何将多租户 django 应用程序部署到 AWS?

django 上多租户应用程序的最佳架构

Django 多租户

多租户数据库实现解决方案汇总

K8s 实践 | 如何解决多租户集群的安全隔离问题?

K8s 实践 | 如何解决多租户集群的安全隔离问题?