Django多租户架构实践:django-tenant-schemas深度解析
项目概述
django-tenant-schemas是一个强大的Django多租户解决方案,它采用PostgreSQL的schema特性实现数据隔离。本文将深入探讨该库的核心功能和使用方法,帮助开发者构建高效的多租户应用系统。
环境要求
使用django-tenant-schemas需要满足以下条件:
- 必须使用PostgreSQL数据库(最低版本要求为PostgreSQL 9.3)
- 支持当前Django维护版本(建议使用最新稳定版)
租户创建与管理
初始化公共租户
在多租户架构中,公共租户(public tenant)是系统的基础,用于存放共享数据和主网站内容。
from customers.models import Client
# 创建公共租户
public_tenant = Client(
domain_url='my-domain.com', # 不要包含端口或www
schema_name='public',
name='公共租户名称',
paid_until='2023-12-31',
on_trial=False
)
public_tenant.save()
创建业务租户
业务租户是实际使用的租户实例,每个租户拥有独立的数据schema。
tenant = Client(
domain_url='tenant.my-domain.com',
schema_name='tenant1',
name='租户业务名称',
paid_until='2023-12-31',
on_trial=True
)
tenant.save() # 自动调用migrate_schemas,租户立即可用
关键管理命令
迁移命令
migrate_schemas是核心命令,它分两步执行迁移:
- 先在public schema上迁移共享应用
- 然后在每个租户schema上迁移租户应用
./manage.py migrate_schemas
重要提示:永远不要直接调用标准的migrate命令,必须使用migrate_schemas。
并行迁移优化
当租户数量增长时,可以使用并行迁移提高效率:
python manage.py migrate_schemas --executor=parallel
相关配置参数:
TENANT_PARALLEL_MIGRATION_MAX_PROCESSES:最大进程数(默认2)TENANT_PARALLEL_MIGRATION_CHUNKS:每个工作进程的迁移块大小(默认2)
租户专属命令
通过tenant_command可以在特定租户上执行管理命令:
./manage.py tenant_command loaddata --schema=customer1
存储解决方案
默认情况下,Django的文件存储API不会隔离租户的媒体文件。必须配置租户感知的存储后端:
# settings.py
DEFAULT_FILE_STORAGE = 'tenant_schemas.storage.TenantFileSystemStorage'
在Nginx配置中,需要使用正则表达式匹配域名,将请求路由到正确的媒体目录:
location /media/ {
alias /data/media/$2/; # $2匹配域名部分
}
实用工具函数
上下文管理器
schema_context和tenant_context允许在代码块中临时切换schema:
from tenant_schemas.utils import tenant_context
with tenant_context(tenant):
# 在此代码块中的所有操作都在指定租户的schema上执行
User.objects.create(username='admin')
辅助函数
schema_exists(schema_name):检查schema是否存在get_tenant_model():获取租户模型类get_public_schema_name():获取公共schema名称
信号机制
post_schema_sync信号在租户创建并完成schema同步后触发:
from tenant_schemas.signals import post_schema_sync
def setup_tenant(sender, tenant, **kwargs):
# 租户初始化逻辑
print(f"租户 {tenant.name} 已准备就绪")
post_schema_sync.connect(setup_tenant)
日志增强
通过TenantContextFilter可以将租户信息加入日志上下文:
LOGGING = {
'filters': {
'tenant_context': {
'()': 'tenant_schemas.log.TenantContextFilter'
},
},
'formatters': {
'tenant_context': {
'format': '[%(schema_name)s:%(domain_url)s] %(message)s',
},
}
}
输出示例:[example:example.com] 用户admin登录成功
性能优化
设置TENANT_LIMIT_SET_CALLS可以减少search_path的设置次数,提高性能:
# settings.py
TENANT_LIMIT_SET_CALLS = True # 默认为False
启用后,每个请求只会设置一次search_path,而不是每次数据库操作都设置。
第三方集成
Celery集成
需要额外安装tenant-schemas-celery扩展来实现多租户任务队列支持。
Django Debug Toolbar
需要手动将调试工具栏的路由添加到公共和租户的urls.py中:
if settings.DEBUG:
urlpatterns += [
path('__debug__/', include(debug_toolbar.urls)),
]
通过本文的全面介绍,开发者可以掌握django-tenant-schemas的核心功能和使用技巧,构建高效、隔离性好的多租户应用系统。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



