使用PostgreSQL模式的Django租户支持。
项目描述
这是django-tenant-schemas的一个分支。
此应用程序使由django驱动的网站能够通过PostgreSQL模式拥有多个租户。这是每个软件即服务网站的关键功能。
Django目前没有简单的方法来支持使用相同的项目实例的多个租户,即使数据不同。因为我们不希望您运行多个项目副本,您将能够
在同一个实例上运行多个客户
共享和特定于租户的数据
租户视图路由
什么是模式
模式可以看作是操作系统中的一个目录,每个目录(模式)都有自己的一套文件(表和对象)。这允许在不同的模式中使用相同的表名和对象,而不会发生冲突。有关模式的具体描述,请参阅PostgreSQL官方关于模式的文档。
为什么要使用模式
解决多租户问题的方案通常有三个。
隔离方法:独立数据库。每个租户都有自己的数据库。
半隔离方法:共享数据库,独立模式。一个数据库供所有租户使用,但每个租户有一个独立的模式。
共享方法:共享数据库,共享模式。所有租户共享同一个数据库和模式。有一个主租户表,所有其他表都通过外键指向它。
此应用程序实现了第二种方法,我们认为这代表了简单性和性能之间的理想折衷。
简单性:几乎不需要修改现有代码来支持多租户。此外,您只需管理一个数据库。
性能:利用共享连接、缓冲区和内存。
每种方案都有其优缺点,有关更深入的讨论,请参阅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_path 为 tenant1 和 public,这样共享应用也能可用。这意味着任何调用 filter、get、save、delete 或涉及数据库连接的其他函数现在都将在该租户的模式下执行,因此你不需要在视图中做任何更改。
你已经设置好了,但我们在这个简短的教程中省略了一些关键细节,例如创建公共租户和配置共享和特定租户的应用。完整的说明可以在 django-pg-tenants.readthedocs.io 找到。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源分布
构建分布
django-pg-tenants-2.0.1.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cbf58b4a2bc3b7cb6dd818b6f86361956bdfedcad384f220c1b29548252a8ca8 |
|
MD5 | 2314b49fcbe7ca5d273263a5d35d28ef |
|
BLAKE2b-256 | 8da80f4733f8776a15d2993a48af14138421a453725262f339128ae6f0b90998 |
django_pg_tenants-2.0.1-py3-none-any.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fd5a47d788ca355a49d2bb8d5a92d7ecedd7d1fbbb779e07517512eee3fb7cc9 |
|
MD5 | 06ab7d7270d691c4df5896d9f3f17952 |
|
BLAKE2b-256 | 5392d3080da0366c3e0dcc0a348f9aa20029ca1da94bb0f5075465e1d792c061 |