2017-07-30 22 views
1

我试图让django-tenant-schemas重新路由用户,如果他们使用可选设置PUBLIC_SCHEMA_URLCONF访问基本域。每当我参观 基本URL我得到这样的回应:在django-tenant-schemas中使用PUBLIC_SCHEMA_URLCONF

enter image description here

我希望有人能告诉我什么PUBLIC_SCHEMA_URLCONF值应根据我的项目结构,或者其他任何东西可能是错的。当用户尝试访问基本域时,我想使用public_website的网址。

我的项目目录如下:

website 
├──approvals 
├──batches 
├──customauth 
├──email_portal 
├──exports 
├──file_downloads 
├──password_reset 
├──payroll 
├──payroll_codes 
├──reports 
├──scheduling 
├──shifts 
├──static 
├──templates 
├──website 
| ├──migrations 
| ├──static 
| ├──templates 
| └──settings 
|  ├──__init__.py 
|  ├──base.py 
|  ├──prod.py 
|  └──dev.py 
├──scheduling 
├──public_website 
| ├──__init__.py 
| └──urls.py 
└──manage.py 

而且我想PUBLIC_SCHEMA_URLCONF指在public_website的网址,这看起来像:

from django.conf.urls import include, url 

import website.views as website_views 
from django.contrib import admin 
from django.http import HttpResponse 

url_patterns = [ 
    url(r'^$', lambda request: HttpResponse('ok')), 
    url(r'^admin/login/', website_views.Login.as_view()), 
    url(r'^admin/', include(admin.site.urls)) # user authentication urls 
] 

以下是我的设置中的相关位:

DJANGO_APPS = (
    'jet', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django_extensions', 
    'django.contrib.admin', 
    'django_user_agents', 
    'django_ses', 
    # 'admin_reorder' 
) 

MY_APPS_WITH_MODELS = (
    'customauth', 
    'payroll_codes', 
    'scheduling', 
    'payroll', 
    'shifts', 
    'email_portal', 
    'tutor_training_tracker' 
) 

MY_APPS_WITHOUT_MODELS = (
    'exports', 
    'reports', 
    'file_downloads', 
    'batches', 
    'approvals' 
) 

SHARED_APPS = (
    'tenant_schemas', 
    'website', 
    'public_website' 
) 
TENANT_APPS = DJANGO_APPS + MY_APPS_WITH_MODELS 
INSTALLED_APPS = list(OrderedDict.fromkeys(SHARED_APPS + DJANGO_APPS + MY_APPS_WITHOUT_MODELS + MY_APPS_WITH_MODELS)) 
ROOT_URLCONF = 'website.urls' 
PUBLIC_SCHEMA_URLCONF = 'public_website.urls' 
TENANT_MODEL = "website.Client" 
DEFAULT_FILE_STORAGE = "tenant_schemas.storage.TenantFileSystemStorage" 

任何帮助将不胜感激d。

解决方法:

(感谢Thomas写我中间件)

添加自定义中间件类:

from django.conf import settings 
from django.db import connection 
from tenant_schemas.middleware import MIDDLEWARE_MIXIN 
from tenant_schemas.utils import remove_www, get_tenant_model, get_public_schema_name 


class CustomTenantMiddleware(MIDDLEWARE_MIXIN): 
    def get_tenant(self, model, hostname, request): 
     return model.objects.get(domain_url=hostname) 

    def hostname_from_request(self, request): 
     """ Extracts hostname from request. Used for custom requests filtering. 
      By default removes the request's port and common prefixes. 
     """ 
     return remove_www(request.get_host().split(':')[0]).lower() 

    def process_request(self, request): 
     # Connection needs first to be at the public schema, as this is where 
     # the tenant metadata is stored. 
     connection.set_schema_to_public() 

     hostname = self.hostname_from_request(request) 
     TenantModel = get_tenant_model() 

     try: 
      # get_tenant must be implemented by extending this class. 
      tenant = self.get_tenant(TenantModel, hostname, request) 
      assert isinstance(tenant, TenantModel) 
      request.tenant = tenant 
      connection.set_tenant(request.tenant) 

     except (TenantModel.DoesNotExist, AssertionError): 
      request.urlconf = settings.PUBLIC_SCHEMA_URLCONF 
      request.public_tenant = True 
      return 

     if hasattr(settings, 'PUBLIC_SCHEMA_URLCONF') and request.tenant.schema_name == get_public_schema_name(): 
      request.urlconf = settings.PUBLIC_SCHEMA_URLCONF 

,并设置引用它:

MIDDLEWARE_CLASSES = (
    # 'tenant_schemas.middleware.TenantMiddleware', 
    'website.middleware.CustomTenantMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'django.middleware.security.SecurityMiddleware', 
    'django_user_agents.middleware.UserAgentMiddleware', 
    'admin_reorder.middleware.ModelAdminReorder', 
    'website.middleware.CustomTenantMiddleware', 
    # 'djadmin.middleware.DJMiddleware', 
) 

回答

2

我维护Django-Tenants,这是django-tenant-schemas的一个分支。公共网址文件在域名与租户不匹配时被调用。然而取决于你有这个中间件可能会导致这个不起作用。如果是这种情况,则为租户编写自定义中间件。你可能也想编辑你的主机文件,因为它很难通过编辑进行测试。你使用什么中间件?

+0

我的主机文件设置为允许tenant1.localhost和tenant2.localhost,并且这两个网站工作正常。这只是本地主机,并不指引我在我想要的地方。我在中间件中列出了tenant_schemas.middleware.TenantMiddleware。 – DragonBobZ

+0

您是否更改了PUBLIC_SCHEMA_NAME? –

+0

我没有改变它的默认值。我现在只是明确地将其设置为“公开”而没有改变。 – DragonBobZ