Skip to main content
 首页 » 编程设计

python之使用 URL 映射而不是域映射的 Multi-Tenancy Django 应用程序

2025年02月15日51arxive

在 django 中,大多数 Multi-Tenancy 实现(模块)都是将主机映射到 View 。

例如映射主机/URL -> 使用 postgress 模式的 django View :

customer1.myapp.com/view1/arg1 -> myapp.view1(arg1)  using schema 'customer1' 
customer2.myapp.com/view1/arg1 -> myapp.view1(arg1)  using schema 'customer2' 
customer3.myapp.com/view1/arg1 -> myapp.view1(arg1)  using schema 'customer3' 

由于我的 PaaS (Pythonanywhere) 不支持通配符域 (*.myapp.com),我正在尝试使用 URL 映射设置 Multi-Tenancy 应用程序:

例如映射 URL -> Django View :

myapp.com/customer1/view1/arg1 ->  myapp.view1(arg1) passing implicit parameter tenant='customer1' 
myapp.com/customer2/view1/arg1 ->  myapp.view1(arg1) passing implicit parameter tenant='customer2' 
myapp.com/customer3/view1/arg1 ->  myapp.view1(arg1) passing implicit parameter tenant='customer3' 

这里一些中间件应该负责将租户参数传递给 View 并过滤适用于所选租户的对象的查询结果。 例如https://django-tenant-schemas.readthedocs.io/en/latest/

但这里的问题是:对于 URL 映射而不是主机映射,如何做到这一点 - 哪个包可以处理这个?

注意:django-multitenants 提到“支持 url 模式以及子域”,但不清楚如何做到这一点...... https://pypi.python.org/pypi/django-multitenants

请您参考如下方法:

通过以下方式在 Pythonanywhere 支持的大力帮助下解决了问题:

  1. 为每个租户创建一个新的网络应用程序(是的,这需要花费 2 美元/月)
  2. 将新域映射到新的 webapp(检查 pythonanywhere web 选项卡“DNS setup”)
  3. 让每个 webapp 使用相同的代码和相同的 postgres 数据库(复制静态和媒体 patsh 和 wsgi 脚本)
  4. 在 postgres 数据库中创建新模式
  5. 剩下的很简单:按照 django-tenant-schemas 的文档进行操作

大致:

  • 同步新架构:./manage.py migrate_schemas --schema=my-new-tenant
  • 将新租户添加到公共(public)租户“customers_client”表
  • 如果您的用户模型不在公共(public)表中:为该租户创建新的管理员用户:./manage.py createsuperuser --schema=my-new-tenant