跳转到主要内容

使用PostgreSQL模式的Django租户支持。

项目描述

PyPi version PyPi downloads Python versions Travis CI PostgreSQL

这是django-tenant-schemas的一个分支。

此应用程序使由django驱动的网站能够通过PostgreSQL模式拥有多个租户。这是每个软件即服务网站的关键功能。

Django目前没有简单的方法来支持使用相同的项目实例的多个租户,即使数据不同。因为我们不希望您运行多个项目副本,您将能够

  • 在同一个实例上运行多个客户

  • 共享和特定于租户的数据

  • 租户视图路由

什么是模式

模式可以看作是操作系统中的一个目录,每个目录(模式)都有自己的一套文件(表和对象)。这允许在不同的模式中使用相同的表名和对象,而不会发生冲突。有关模式的具体描述,请参阅PostgreSQL官方关于模式的文档

为什么要使用模式

解决多租户问题的方案通常有三个。

  1. 隔离方法:独立数据库。每个租户都有自己的数据库。

  2. 半隔离方法:共享数据库,独立模式。一个数据库供所有租户使用,但每个租户有一个独立的模式。

  3. 共享方法:共享数据库,共享模式。所有租户共享同一个数据库和模式。有一个主租户表,所有其他表都通过外键指向它。

此应用程序实现了第二种方法,我们认为这代表了简单性和性能之间的理想折衷。

  • 简单性:几乎不需要修改现有代码来支持多租户。此外,您只需管理一个数据库。

  • 性能:利用共享连接、缓冲区和内存。

每种方案都有其优缺点,有关更深入的讨论,请参阅Microsoft关于多租户数据架构的优秀文章。

它是如何工作的

租户通过其主机名(例如 tenant.domain.com)进行识别。此信息存储在public模式上的一个表中。每次请求时,都会使用主机名来匹配数据库中的租户。如果找到匹配项,搜索路径将更新为使用此租户的模式。因此,从现在起,所有查询都将在此租户的模式中执行。例如,假设您有一个名为customer的租户,位于http://customer.example.com。任何到达customer.example.com的请求将自动使用customer的模式,并在请求中使租户可用。如果没有找到租户,将引发404错误。这也意味着您应该为您的主域设置一个租户,通常使用public模式。有关更多信息,请参阅设置部分。

此应用程序能做什么?

您想要的任意数量的租户

每个租户在其特定的模式上都有自己的数据。使用单个项目实例来服务尽可能多的租户。

特定租户和共享应用程序

特定租户的应用程序不会在租户之间共享数据,但您也可以拥有共享应用程序,其中信息始终可用,并在所有租户之间共享。

租户视图路由

您可以为http://customer.example.com/http://example.com/设置不同的视图,即使Django只使用主机名后面的字符串来识别要服务的视图。

魔法

每个人都喜欢魔法!您将能够实现所有这些,几乎不需要更改代码!

设置 & 文档

这只是一个简短的设置指南,强烈建议您在django-pg-tenants.readthedocs.io上阅读完整版本。

您的DATABASE_ENGINE设置需要更改为

DATABASES = {
    'default': {
        'ENGINE': 'tenant_schemas.postgresql_backend',
        # ..
    }
}

将中间件tenant_schemas.middleware.TenantMiddleware添加到MIDDLEWARE_CLASSES的顶部,以便每个请求都可以设置为使用正确的模式。

MIDDLEWARE_CLASSES = (
    'tenant_schemas.middleware.TenantMiddleware',
    #...
)

tenant_schemas.routers.TenantSyncRouter添加到您的DATABASE_ROUTERS设置中,以便根据要同步的内容(共享或租户)同步正确的应用程序。

DATABASE_ROUTERS = (
    'tenant_schemas.routers.TenantSyncRouter',
)

tenant_schemas添加到您的INSTALLED_APPS中。

创建您的租户模型

from django.db import models
from tenant_schemas.models import TenantMixin

class Client(TenantMixin):
    name = models.CharField(max_length=100)
    paid_until =  models.DateField()
    on_trial = models.BooleanField()
    created_on = models.DateField(auto_now_add=True)

settings.py 文件中定义你的租户模型。假设你在名为 customers 的应用中创建了 Client,那么你的 TENANT_MODEL 应该如下所示

TENANT_MODEL = "customers.Client" # app.Model

现在运行 migrate_schemas 以同步你的应用到 public 模式。

python manage.py migrate_schemas --shared

创建租户就像正常使用 django 模型一样。调用 save 将会自动创建和同步/迁移模式。

from customers.models import Client

# create your public tenant
tenant = Client(domain_url='tenant.my-domain.com',
                schema_name='tenant1',
                name='My First Tenant',
                paid_until='2014-12-05',
                on_trial=True)
tenant.save()

现在对 tenant.my-domain.com 的任何请求都会自动设置 PostgreSQL 的 search_pathtenant1public,这样共享应用也能可用。这意味着任何调用 filtergetsavedelete 或涉及数据库连接的其他函数现在都将在该租户的模式下执行,因此你不需要在视图中做任何更改。

你已经设置好了,但我们在这个简短的教程中省略了一些关键细节,例如创建公共租户和配置共享和特定租户的应用。完整的说明可以在 django-pg-tenants.readthedocs.io 找到。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

django-pg-tenants-2.0.1.tar.gz (60.3 kB 查看哈希)

上传时间 源代码

构建分布

django_pg_tenants-2.0.1-py3-none-any.whl (40.2 kB 查看哈希)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面