跳转到主要内容

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

项目描述

PyPi version PyPi downloads

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

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

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

  • 共享和租户特定数据

  • 租户视图路由

什么是模式

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

为什么使用模式

解决多租户问题通常有三种典型解决方案。

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

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

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

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

  • 简单性:几乎不需要对当前代码进行任何更改即可支持多租户。此外,你只需要管理一个数据库。

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

每个解决方案都有其优缺点,要深入了解,请参阅微软关于多租户数据架构的优秀文章。

它是如何工作的

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

此应用能做什么?

您想要的任意数量的租户

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

特定租户和共享应用

特定租户的应用之间不共享数据,但您也可以有共享应用,其中信息总是可用并可供所有租户共享。

租户视图路由

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

魔法

每个人都喜欢魔法!您几乎无需更改代码即可拥有所有这些功能!

设置 & 文档

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

您的 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(如果您使用的是Django 1.6及更早版本,则使用 sync_schemas),这将同步您的应用到公共模式。

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_path 设置为 tenant1public,使得共享应用程序也可用。这意味着对 filtergetsavedelete 或任何涉及数据库连接的其他函数的调用现在将在租户的模式下执行,所以您不需要更改视图中的任何内容。

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

项目详情


下载文件

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

源分布

django-tenant-schemas-ap-0.1.1.tar.gz (47.0 kB 查看哈希)

上传时间

构建分布

django_tenant_schemas_ap-0.1.1-py2.py3-none-any.whl (37.1 kB 查看哈希)

上传时间 Python 2 Python 3

django_tenant_schemas_ap-0.1.1-py2-none-any.whl (37.1 kB 查看哈希)

上传时间 Python 2

支持者:

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