2013-08-20 6 views
2

Я пытаюсь запустить django-cms на двух разных доменах. Для этого я создал два домена (django.contrib.sites) и добавил к ним страницы django-cms. Теперь я создал SiteDetectionMiddleware:Django-CMS: Несколько доменов в одном проекте

class SiteDetectionMiddleware: 
    def process_request(self, request): 
    settings.SITE_ID = 1 
    host = request.META.get('HTTP_HOST') 
    if host: 
     try: 
     site = Site.objects.get(domain=host) 
     settings.SITE_ID = site.id 
     except Site.DoesNotExist: 
     pass 

Это, кажется, работает правильно, когда я называю веб-сайт в браузере в первый раз после перезагрузки Apache. Затем я перешел на другой сайт и получил ошибку NoReverseMatch.

Есть ли у кого-нибудь идеи, что может быть неправильным?

Я думал, что это должно работать из коробки в django-cms?

привет Colin

ответ

6

Почему вы настройки SITE_ID статически? Вы, вероятно, следует создать два файла настроек и использовать некоторые формы наследования в зависимости от дифференциации проекта, например:

local_settings.py (не по версии управления держит конфиденциальные данные, такие как пароли баз данных и секретного ключа)

SECRET_KEY = '[email protected]$1AJFS78787124!897zR81' 

settings.py (содержит настройки, которые одинаковы для обоих сайтов)

# preferably at the bottom 
try: 
    from local_settings import * 
except ImportError: 
    pass 

settings_foo.py (имеет параметры, специфичные для сайта 1)

from settings import * 

SITE_ID = 1 

settings_bar.py (имеет параметры, специфичные для сайта 2)

from settings import * 

SITE_ID = 2 

settings_deployment_foo.py (перезаписывает переменные для производства)

from settings_foo import * 

DEBUG = False 

settings_deploy ment_bar.py (перезаписывает переменные для производства)

from settings_bar import * 

DEBUG = False 

Тогда просто создать два сайта в admin/sites или использовать приспособление (предполагая, что вы используете базу данных пересекаться эти проекты вы будете иметь только сделать это один раз).

+0

Спасибо, это очень помогло. :) +1 – cwirz

+1

@Hedde van der Heide, как мы можем загружать соответствующие settings.py для каждого сайта динамически на основе типизированного URL-адреса. – bhushya

+0

@Wirzi Как загружать 'settings_foo.py' и' settings_bar.py' динамически на основе идентификатора сайта? – bhushya

1

После нескольких часов проб и ошибок, я получил следующее решение.

Мы должны иметь отношение между SITE и CMS_LANGUAGES

К примеру, у меня есть два сайта abc.com с сайтом ID 1 и xyz.com с сайтом ID 2

поэтому необходимо отметить следующее отношения в settings.py

CMS_LANGUAGES = { 
     ## Customize this 
     'default': { 
      'public': True, 
      'hide_untranslated': False, 
      'redirect_on_fallback': True, 
     }, 
     1: [ 
      { 
       'public': True, 
       'code': 'en', 
       'hide_untranslated': False, 
       'name': gettext('en'), 
       'redirect_on_fallback': True, 
      }, 
      { 
       'public': True, 
       'code': 'zh', 
       'hide_untranslated': False, 
       'name': gettext('zh'), 
       'redirect_on_fallback': True, 
      }, 
      { 
       'public': True, 
       'code': 'my', 
       'hide_untranslated': False, 
       'name': gettext('my'), 
       'redirect_on_fallback': True, 
      }, 
     ], 
     2: [ 
      { 
       'public': True, 
       'code': 'en', 
       'hide_untranslated': False, 
       'name': gettext('en'), 
       'redirect_on_fallback': True, 
      }, 
      { 
       'public': True, 
       'code': 'zh', 
       'hide_untranslated': False, 
       'name': gettext('zh'), 
       'redirect_on_fallback': True, 
      }, 
      { 
       'public': True, 
       'code': 'my', 
       'hide_untranslated': False, 
       'name': gettext('my'), 
       'redirect_on_fallback': True, 
      }, 
     ], 
    } 

A lso Я использую промежуточное ПО site, которое определяет идентификатор сайта с использованием имени домена.

Я надеюсь, что это помогает кто-то :)

2

Если ваши языки одинаковы для всех доменов, как xyz.com и abc.com

Таким образом, вы можете справиться с этим в ПО промежуточного слоя, так промежуточного слоя может назначить доступные языки для подобластей во время выполнения ,

from django.conf import settings 
from django.contrib.sites.models import Site 

class SiteMiddleware(object): 
    def process_request(self, request): 
     try: 
      current_site = Site.objects.get(domain=request.get_host()) 
     except Site.DoesNotExist: 
      current_site = Site.objects.get(id=settings.DEFAULT_SITE_ID) 

     request.current_site = current_site 
     settings.SITE_ID = current_site.id 
     settings.SITE_NAME = current_site.name 
     if settings.SITE_ID is not 1: 
      settings.CMS_LANGUAGES[settings.SITE_ID] = settings.CMS_LANGUAGES[1] 
Смежные вопросы