django下多租户的实现,有一个例子叫django-tenants,但是它的安装和部署方法有点复杂,官方的文档写得不好(顺序不对,数据也不对),如下面的网址。
https://django-tenants.readthedocs.io/en/latest/install.html#
我根据这个网址,一步步摸索,得到了下面的正确部署方式,供大家研究。
(遗憾的是,django-tenants只能与postgresql搭配,我尝试用mysql来实现,是进行不下去的)
第一步,下载代码和库
1 下载代码
从https://github.com/django-tenants/django-tenants上,fork一个工程到自己的仓库,再用git pull下载代码。
或者,直接用http下载https://github.com/django-tenants/django-tenants/archive/refs/heads/master.zip
2 安装库
用这个命令安装库
pip install django-tenants
3.修改配置
修改examples\tenant_tutorial\settings.py中
DATABASES = {
'default': {
'ENGINE': 'django_tenants.postgresql_backend',
'NAME': os.environ.get('DATABASE_DB', 'tenant_tutorial'),
'USER': os.environ.get('DATABASE_USER', 'postgres'),
'PASSWORD': os.environ.get('DATABASE_PASSWORD', 'postgres.111'),
'HOST': os.environ.get('DATABASE_HOST', 'localhost'),
'PORT': os.environ.get('DATABASE_PORT', '5432'),
}
}
4 安装数据库postgresql
安装postgresql,设置用户名为postgres,密码为postgres.111,创建一个数据库tenant_tutorial
然后执行:
python examples\tenant_tutorial\manage.py makemigrations
python examples\tenant_tutorial\manage.py migrate
成功后可以看到postgresql中,tenant_tutorial数据库的schemas下public用户生成了许多Tables。
执行“启动网站“命令:
python examples\tenant_tutorial\manage.py runserver 127.0.0.1:8088
后,可以点击出现的链接:http://127.0.0.1:8088/
浏览器能正确打开网址,提示第2步:
Second Step: Create a public tenant
第二步:
在终端按CTRL+C停止网站服务器
执行.\examples\tenant_tutorial\manage.py shell
后稍等一会,他会打开manager.py,并进入manager.py文件的编辑状态,复制以下内容到该文件后面:
from customers.models import Client, Domain
tenant = Client(schema_name='public',
name='Trendy SaSS',
description='Public Tenant')
tenant.save()
domain = Domain()
domain.domain = 'public.yanhexing.com'
domain.tenant = tenant
domain.is_primary = True
domain.save()
print("create public done")
保存文件后,再次“启动网站“,然后再按CTRL+C停止时,可以看到create public done的打印,并可以在pgAdmin中看到customers_client表和customers_domain表各增加了一条记录。同时也会提示错误: 重复键违反唯一约束等,可以忽略。
再次执行python manage.py runserver然后进入网站,看到网页已经刷新,提示需要进行第三步。
第三步:
1 创建两个租户
用同样的办法,追加以下内容到manager.py,但是要先把前面加的内容先删除。
from customers.models import Client, Domain
tenant = Client(schema_name='tenant1',
name='Tenant1 - Awesome',
description='Our second real tenant, awesome!')
tenant.save()
domain = Domain()
domain.domain = 'tenant1.yanhexing.com'
domain.tenant = tenant
domain.is_primary = True
domain.save()
print("create tenant1 done")
执行python manage.py runserver然后再按CTRL+C停止。
再把tenant1改成tenant2,再来一遍。这样customers_client表和customers_domain表各增加了两条记录
2 创建假域名测试
编辑hosts文件,弄一个虚假的域名与127.0.0.1对应。windows系统,是这个文件:
C:\Windows\System32\drivers\etc\hosts
在原来的文件内容后面追加如下:
127.0.0.1 leo.com
127.0.0.1 public.yanhexing.com
127.0.0.1 tenant1.yanhexing.com
127.0.0.1 tenant2.yanhexing.com
然后,类似于创建public公共租户的方法,同样创建两个租户:
最后,再次执行启动网站,进入网站后,看到”Tutorial Complete!“
网页里面有域名的链接:http://public.yanhexing.com:8088/
http://tenant1.yanhexing.com:8000/和http://tenant2.yanhexing.com:8000/,等,点击不同域名网址,可以看到网页已经可以访问不同的数据。
到此,多租户系统部署成功。