我一直在思索创建多租户应用程序的正确/最佳方式 在Django上。
一些解释:
应用程序可供多个租户使用(tenant1,tenant2,...,)。
必须保护所有租户个人数据不被其他租户(及其用户)访问。
可选租户可以为应用程序对象创建其他自定义字段。
当然,底层硬件会限制一个“系统”上的租户数量。
1)将每个租户分开,例如子域和在底层使用特定于租户的数据库
2)在模型中使用一些租户ID来分离数据库中的租户数据
我在考虑部署过程,系统部件的性能(web-server(s),数据库服务器,工作节点......)
什么是最好的设置?专业人士和骗子在哪里?
您怎么看?
答案 0 :(得分:54)
我们使用以下架构构建了多租户platform。我希望你能找到一些有用的提示。
(r'^(?P<tenant_id>[\w\-]+)
threading.local
的{{3}})login_required
),中间件或工厂以保护视图并选择正确的模型关于环境,我们使用以下设置:
从我的观点来看,这个设置有以下专业和概念:
临:
魂斗罗:
当然,最佳架构在很大程度上取决于您对租户数量,模型的增量,安全要求等的要求。
更新:在我们审核我们的架构时,我建议不重写URL,如第2-3点所示。我认为更好的解决方案是将tenant_id
作为请求标头,并使用tenant_id
之类的内容从请求中提取(第4点)request.META.get('TENANT_ID', None)
。这样您就可以获得中性网址,并且使用Django内置函数(例如{% url ...%}
或reverse()
)或外部应用程序会更容易。
答案 1 :(得分:4)
以下是相关讨论的一些指示:
mezzanine.utils.sites.current_site_id
,mezzanine.core.models.SiteRelated
和mezzanine.core.request
答案 2 :(得分:1)
我建议您查看https://github.com/bcarneiro/django-tenant-schemas。它会像Reto提到的那样解决你的问题,除了它使用postgresql模式。