Python / Django多租户解决方案

时间:2013-10-07 17:10:13

标签: python django multi-tenant

我可以使用一些帮助为我正在进行的项目创建攻击计划。

想象一下,该网站是一个负责监管遍布全球的区域销售办事处的团队。该项目的目的是让超级用户快速启动特定于每个办公室的新子站点 - 频繁添加站点。办公室子站点应完全包含在" admin"特定于该子站点的用户,应该是用户友好的CMS。超级用户应该能够介入并管理所有这些办公室子站点。

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

我使用Django完成了一些网站,但从来没有任何多租户。我想了解可能有用的技术或教程/文档的建议。

要求:

  1. 每个子站点使用相同的源(模板,JS,可用功能等),但可以进行修改以反映模板中的自定义内容。
  2. 为每个子站点分配的子域(可选择使用完全限定的域),在项目中配置,而不是在硬编码的设置文件中。
  3. 除了可以访问所有子站点的超级用户之外,还有特定于子站点的用户访问控制。
  4. 能够提供独立的"每个子站点的CMS。即,子站点管理员只能看到他们的内容。我对这个项目的偏好是django-cms,但我愿意接受建议。
  5. 支持汇集所有子站点数据的应用程序,但限制子站点"管理员"仅查看他们的记录到该应用程序。
  6. 考虑到上述情况,您会推荐什么方法?我愿意重新考虑技术,但我想坚持使用Python。

4 个答案:

答案 0 :(得分:11)

有一个名为django-tenant-schemas的优秀应用程序,它使用PostgreSQL架构机制来创建多租户。

你得到的是包含所有模式(子网站)共享的对象的SHARED_APPS,以及包含特定于子网站的对象的TENANT_APPS,即用户,记录等。模式完全相互隔离。

每个PostgreSQL架构都绑定到域URL,以便中间件检查请求的HOST部分,并设置数据库连接的架构以适应它。

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

答案 1 :(得分:5)

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

上述两个库在组合时,能够提供多租户且灵活的django实例。我的意思是灵活的是:您可以定义任何模型,无论是“租户”还是“全球”。因此,您可以拥有一个包含全球用户但是每个租户产品目录的站点,或者每个租户+产品。从我尝试过的许多django应用程序中,这是实现多租户的最灵活方式

答案 2 :(得分:2)

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

除了我认为的子站点用户控件之外,它具有您请求的大多数功能。对于管理员用户,管理页面可以由站点分隔,但普通用户不能。

但是,如果你不需要CMS,这可能对你的用例来说太过分了,但我想在这里提一下它的完整性。

答案 3 :(得分:0)

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

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