1 Star 10 Fork 2

独行侠 / djangoMultiTenant

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

DjangoMultiTenant

django 多租户方案实现方案,本插件的是在数据库层对租户数据进行了隔离,保证每个租户只能访问自己的数据库信息,完整兼容django所有功能

安装

pip install django-multi-tenancy

兼容性

  • django >= 3.2

其他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']

主要模块说明以及使用

数据库模块

  1. 默认default数据库为主数据库,只保存公共模块数据,租户数据库可以动态创建,创建一个租户,会自动在数据库中创建了一个对应租户的数据库,所有租户的数据库结构相同

  2. 可以在DATABASE_APPS_MAPPING中指定某个app属于公共app,还是租户app,公共app默认数据库链接为default

multi_tenant.tenant 多租户模块

  1. Tenant为租户模型,当然你可以继承AbstractTenant来自定义自己的租户模块,并在settings中指定DEFAULT_TENANT_MODEL常量来指定租户模型

  2. GlobalUser 为全局用户,不分数据哪个租户,这里用GlobalUser替代了django.contrib.auth.models.User模块,因此django.contrib.auth.get_user_model 获取的是GlobalUser对象,相应的request.user也是GlobalUser对象,用户可以被加入租户,也可以选择不加入租户,加入租户的用户只能访问相应租户数据,不加入租户的用户如果是超级管理员可以访问全局用户租户信息

  3. 租户用户表默认采用django.contrib.auth.models.User,当然你可以选择继承django.contrib.auth.models.AbstractUser来自定义自己的租户用户模块,并在settings中指定AUTH_TENANT_USER_MODEL常量来指定租户用户,用户可以在租户层面完整的使用django.contrib.auth所有功能,包括UserGroupPermissionAdmin

  4. 可以登录Admin 后台创建租户,也可以使用createtenant命令行来创建租户

multi_tenant.proxy 代理模块

ProxyContentTypecontentType代理,因为在多租户模型中,主数据库和租户数据库数据模型不一样,在不断的迭代更新中,新的租户和老的租户模型ContentType数据信息也不一样,django默认自带的ContentType模型默认自带缓存,ProxyContentType模型无缓存,每次的数据访问都是直接访问数据库,这样避免了ContentType信息不一致导致的异常

multi_tenant.rest rest_framework适配模块

  1. rest_framework进行了适配,保证租户只能访问自己的租户的数据
  2. 提供了一个IsTanenatUser权限类,判断是不是租户用户
  3. 适配了rest_framework的内置权限IsAdminUserDjangoModelPermissionsDjangoModelPermissionsOrAnonReadOnlyDjangoObjectPermissions

migrate 模块

  1. 迁移租户数据库,请给migrate 指定--database参数值, --database
  2. 也可以使用multimigrate,必须指定--database参数值,或者直接使用--all,来迁移所有租户表结构

支持的数据库

适配了支持django所有支持的数据库(SQLite3MySQLPosgresOracle

例子

可以参考examples的使用

MIT License Copyright (c) 2021 独行侠 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

Django 多租户实现,实现了数据库层的租户数据隔离,兼容django.auth、admin、migrate等模块,支持rest_framework,支持django默认支持的所有数据库 展开 收起
Python
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Python
1
https://gitee.com/Ranger313/django-multi-tenant.git
git@gitee.com:Ranger313/django-multi-tenant.git
Ranger313
django-multi-tenant
djangoMultiTenant
master

搜索帮助