Django多租户架构实践:django-tenant-schemas深度解析

Django多租户架构实践:django-tenant-schemas深度解析

【免费下载链接】django-tenant-schemas Tenant support for Django using PostgreSQL schemas. 【免费下载链接】django-tenant-schemas 项目地址: https://gitcode.com/gh_mirrors/dj/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是核心命令,它分两步执行迁移:

  1. 先在public schema上迁移共享应用
  2. 然后在每个租户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_contexttenant_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的核心功能和使用技巧,构建高效、隔离性好的多租户应用系统。

【免费下载链接】django-tenant-schemas Tenant support for Django using PostgreSQL schemas. 【免费下载链接】django-tenant-schemas 项目地址: https://gitcode.com/gh_mirrors/dj/django-tenant-schemas

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值