代码拉取完成,页面将自动刷新
同步操作将从 独行侠/djangoMultiTenant 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
django 多租户方案实现方案,本插件的是在数据库层对租户数据进行了隔离,保证每个租户只能访问自己的数据库信息,完整兼容django所有功能
pip install django-multi-tenancy
其他django版本未测试,不保证兼容性
INSTALLED_APPS = [
'multi_tenant.tenant',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
...
'multi_tenant.proxy',
# rest_framework 需要加载rest app
'multi_tenant.rest'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
# 需要注释官方自带的AuthenticationMiddleware,采用插件的MultTenantAuthenticationMiddleware
# 'django.contrib.auth.middleware.AuthenticationMiddleware',
'multi_tenant.tenant.middleware.authentication.MultTenantAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# AUTH_USER_MODEL 全局用户模型,必须指定
AUTH_USER_MODEL = 'tenant.GlobalUser'
# 租户用户模型,不指定默认为:'auth.User'
AUTH_TENANT_USER_MODEL = 'info.User'
# 租户模型,不指定默认为:'tenant.Tenant'
DEFAULT_TENANT_MODEL = 'tenant.Tenant'
## 数据库映射,这里只需要定义共用的app
DATABASE_APPS_MAPPING = {
'tenant': 'default',
'admin': 'default',
'sessions': 'default'
}
## 数据库映射路由
DATABASE_ROUTERS = ['multi_tenant.tenant.utils.db.MultTenantDBRouter']
default
数据库为主数据库,只保存公共模块数据,租户数据库可以动态创建,创建一个租户,会自动在数据库中创建了一个对应租户的数据库,所有租户的数据库结构相同DATABASE_APPS_MAPPING
中指定某个app
属于公共app
,还是租户app
,公共app
默认数据库链接为default
multi_tenant.tenant
多租户模块Tenant
为租户模型,当然你可以继承AbstractTenant
来自定义自己的租户模块,并在settings
中指定DEFAULT_TENANT_MODEL
常量来指定租户模型GlobalUser
为全局用户,不分数据哪个租户,这里用GlobalUser
替代了django.contrib.auth.models.User
模块,因此django.contrib.auth.get_user_model
获取的是GlobalUser
对象,相应的request.user
也是GlobalUser
对象,用户可以被加入租户,也可以选择不加入租户,加入租户的用户只能访问相应租户数据,不加入租户的用户如果是超级管理员可以访问全局用户
和租户信息
django.contrib.auth.models.User
,当然你可以选择继承django.contrib.auth.models.AbstractUser
来自定义自己的租户用户模块,并在settings中指定AUTH_TENANT_USER_MODEL
常量来指定租户用户,用户可以在租户层面完整的使用django.contrib.auth
所有功能,包括User
、Group
、Permission
、Admin
createtenant
命令行来创建租户multi_tenant.proxy
代理模块ProxyContentType
contentType代理,因为在多租户模型中,主数据库和租户数据库数据模型不一样,在不断的迭代更新中,新的租户和老的租户模型ContentType
数据信息也不一样,django默认自带的ContentType
模型默认自带缓存,ProxyContentType
模型无缓存,每次的数据访问都是直接访问数据库,这样避免了ContentType
信息不一致导致的异常
multi_tenant.rest
rest_framework适配模块rest_framework
进行了适配,保证租户只能访问自己的租户的数据IsTanenatUser
权限类,判断是不是租户用户rest_framework
的内置权限IsAdminUser
、DjangoModelPermissions
、DjangoModelPermissionsOrAnonReadOnly
、DjangoObjectPermissions
migrate
模块migrate
指定--database
参数值,
--database
multimigrate
,必须指定--database
参数值,或者直接使用--all
,来迁移所有租户表结构适配了支持django
所有支持的数据库(SQLite3
、MySQL
、Posgres
、Oracle
)
可以参考examples
的使用
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。