Django Tenant和Django Guardian配置settings.py

时间:2016-06-20 06:07:31

标签: python django multi-tenant

我遇到了配置Django Tenant和Django Guardian的问题。我想按模式分隔用户。我应该把Guardian放在哪里?我应该如何配置它?到目前为止,我还尝试将它从TENANT_APP切换到SHARED_APP(我得到一个与其他先决条件有关的不同错误,auth),我得到一个错误(下面)。另外一个很好的选择,而不是监护人也将不胜感激。

SHARED_APPS = (
    'tenant_schemas',
    'myapp.clients',
    'django.contrib.contenttypes',
    'django.contrib.staticfiles',
)

TENANT_APPS = (
    'django.contrib.contenttypes',
    'custom_user',
    'myapp.users',
    'oauth2_provider',
    'corsheaders',
    'django.contrib.auth',
    'django.contrib.admin',
    'guardian',
    'django.contrib.staticfiles',
    'myapp.accounting',
    'myapp.budget',
    'myapp.enterprise',
    'myapp.payables',
    'myapp.receivables',
    'rest_framework_nested',
    'solo',
    'rest_framework_swagger',    
)

这是我运行python manage.py migrate_schemas时遇到的错误:

relation "users_user" does not exist
LINE 1: ..."."phone_number", "users_user"."email2" FROM "users_coo...

一旦我添加了监护人'就会发生这种情况。在TENANT_APPS

当我在SHARED_APPS中添加它时,我得到了这个:

psycopg2.ProgrammingError: relation "auth_group" does not exist

但是这可以通过django.contrib.admin修复,问题是我希望权限特定于我的租户应用程序

其他配置:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.ext.rest_framework.OAuth2Authentication',
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework.filters.DjangoFilterBackend',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'guardian.backends.ObjectPermissionBackend',
)

查看日志我发现django监护人创建了一个匿名用户

File "/home/myaccount/workspace/enterprise-api/venv/lib/python3.4/site-packages/django/dispatch/dispatcher.py", line 192, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/home/myaccount/workspace/enterprise-api/venv/lib/python3.4/site-packages/guardian/management/__init__.py", line 33, in create_anonymous_user
    User.objects.get(**lookup)
  File "/home/myaccount/workspace/enterprise-api/venv/lib/python3.4/site-packages/django/db/models/manager.py", line 122, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/myaccount/workspace/enterprise-api/venv/lib/python3.4/site-packages/django/db/models/query.py", line 381, in get
    num = len(clone)
  File "/home/myaccount/workspace/enterprise-api/venv/lib/python3.4/site-packages/django/db/models/query.py", line 240, in __len__
    self._fetch_all()
  File "/home/myaccount/workspace/enterprise-api/venv/lib/python3.4/site-packages/django/db/models/query.py", line 1074, in _fetch_all
    self._result_cache = list(self.iterator())

有没有办法告诉监护人等待租户数据库?

1 个答案:

答案 0 :(得分:0)

SHARED_APPS = (
    #tenant requirements
    'tenant_schemas',
    'myapp.clients',
    'django.contrib.contenttypes',
    'django.contrib.staticfiles',
    'django.contrib.auth',
    'myapp.users',
    'guardian',
    'oauth2_provider',
    'rest_framework',
)

TENANT_APPS = (
    'django.contrib.contenttypes',
    'custom_user',
    'coopmsapi.users',
    'oauth2_provider',
    'corsheaders',
    'django.contrib.auth',
    'django.contrib.admin',
    'guardian',
    'django.contrib.staticfiles',
    'rest_framework',
    'myapp',
    'myapp.accounting',
    'myapp.budget',
    'myapp.enterprise',
    'myapp.payables',
    'myapp.receivables',
    'rest_framework_nested',
    'solo',
    'rest_framework_swagger',    
)

多次尝试后,这就是最终工作的结果。我还必须先执行几次迁移应用程序SHARED或TENANT的迁移,否则django-tenant会在创建新模式时自动获取它需要创建某些表。