带有django的多租户架构

时间:2017-01-31 12:07:02

标签: django multi-tenant

我不熟悉使用django的多租户架构。我已按照以下链接https://django-tenant-schemas.readthedocs.io/en/latest/install.html

当我创建客户端对象时,会创建单独的租户架构,这很好。但是跟随用户不是在单独的租户模式中创建的,它只在公共模式中创建。 我的观点:

def registration(request):
   form = RegistrationForm()
   if request.method == 'POST': # Post method
      company_name = request.POST['company_name']
      website = request.POST['website']
      username = request.POST['username']
      f_name = request.POST['first_name']
      l_name = request.POST['last_name']
      email = request.POST['email']
      password = request.POST['password']
      confirm_password = request.POST['confirm_password']
      try:
         """ create Client for tenant schema"""
         client =Client()
         client.domain_url = 'company1.user.com'
         client.schema_name = username
         client.name = company_name
         client.save()

         """ create user"""
         user = User()
         user.username = username
         user.first_name = f_name
         user.last_name = l_name
         user.email = email
         user.set_password(password)
         user.is_active = True
         user.is_staff = True
         user.save()

我希望在用户登录时将域名网址从公共租户重定向到其私人客户租户帐户。

我对这种功能很陌生。

任何人都可以给我一些指导或解决方案。

3 个答案:

答案 0 :(得分:2)

在创建用户之前,将数据库架构设置为新创建的架构。最好的方法是使用schema_context上下文管理器。像这样:

from tenant_schemas.utils import schema_context

with schema_context(client.schema_name):

    user = User()
    user.username = username
    user.first_name = f_name
    user.last_name = l_name
    user.email = email
    user.set_password(password)
    user.is_active = True
    user.is_staff = True
    user.save()

答案 1 :(得分:0)

我建议您使用django-tenant-users。这就是他们的意思。

  

此应用程序扩展了django用户和权限框架,以与django-tenant-schemas或django-tenant一起使用,以允许全局用户按租户分配权限。这允许单个用户属于多个租户和每个租户中的权限,包括允许公共租户中的权限。该应用程序还增加了查询用户所属所有租户的支持。

因此,您可以轻松地在django-tenant-schemasdjango-tenants中管理特定于租户的用户。

答案 2 :(得分:0)

可能在您的settings.py中,仅在SHARED_APPS中配置了“ django.contrib.auth”,这就是该用户仅出现在公共模式中的原因。 请检查您是否也在TENANT_APPS中也声明了“ django.contrib.auth”。