小编mik*_*k3y的帖子

多租户Django应用程序:根据请求改变数据库连接?

我正在寻找其他人尝试使用数据库级隔离来构建多租户Django应用程序的工作代码和想法.

更新/解决方案:我在一个新的开源项目中结束了解决这个问题:请参阅django-db-multitenant

目标

我的目标是在请求进入单个应用服务器(WSGI前端,如gunicorn)时根据请求主机名或请求路径多路复用请求(例如,foo.example.com/将Django连接设置为使用数据库foo,并bar.example.com/使用数据库bar).

先例

我知道Django中有一些现有的多租户解决方案:

  1. django-tenant-schemas:这非常接近我想要的:你以最高优先级安装它的中间件,并向SET search_pathdb 发送命令.不幸的是,这是Postgres特有的,我坚持使用MySQL.
  2. django-simple-multitenant:这里的策略是为所有模型添加"租户"外键,并调整所有应用程序业务逻辑以关键.基本上每一行都被索引(id, tenant_id)而不是(id).我尝试过,并且不喜欢这种方法有很多原因:它使应用程序更复杂,可能导致难以发现的错误,并且它不提供数据库级别的隔离.
  3. 每个租户一个{app server,django设置文件,其中包含适当的db}.阿卡穷人的多租户(实际上富人,考虑到它所涉及的资源).我不想为每个租户启动一个新的应用服务器,并且为了可扩展性,我希望任何应用服务器都能够为任何客户端分派请求.

思路

到目前为止,我最好的想法是做一些类似的事情django-tenant-schemas:在第一个中间件中,抓住django.db.connection并摆弄数据库选择而不是模式.在集合/持久连接方面,我还没有想过这意味着什么

我追求的另一个死胡同是特定于租户的表前缀:除了我需要它们是动态的,即使是Django中也不容易实现全局表前缀(参见被拒绝的票证5000等).

最后,Django 多数据库支持允许您定义多个命名数据库,并根据实例类型和读/写模式在它们之间进行多路复用.没有帮助,因为没有工具可以按请求选择数据库.

有没有人管理类似的东西?如果是这样,你是如何实现它的?

mysql django multi-tenant

31
推荐指数
2
解决办法
5839
查看次数

标签 统计

django ×1

multi-tenant ×1

mysql ×1