Django-CMS:同一项目中的多个域

时间:2013-08-20 07:21:09

标签: python django python-2.7 django-cms

我正在尝试在两个不同的域上运行django-cms。为此,我创建了两个域(django.contrib.sites)并添加了django-cms页面。 现在我创建了一个SiteDetectionMiddleware:

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开箱即用?

关于科林

3 个答案:

答案 0 :(得分:6)

为什么要静态设置SITE_ID?您应该创建两个设置文件,并根据项目区别使用某种形式的继承,例如:

local_settings.py (不在版本控制下保存敏感数据,如数据库密码和密钥)

SECRET_KEY = 'as!sfhagfsA@$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_deployment_bar.py (覆盖生产变量)

from settings_bar import *

DEBUG = False

然后在admin/sites内创建两个网站或使用一个工具(假设您通过这些项目共享数据库,您只需要执行一次)。

答案 1 :(得分:3)

如果您的语言对于xyz.comabc.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]

答案 2 :(得分:1)

经过几个小时的反复试验,我得到了以下解决方案。

我们需要保持SITECMS_LANGUAGES

之间的关系

例如,我有两个网站abc.com,网站ID为1,xyz.com网站ID为

  

因此您需要在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,
            },
        ],
    }

此外,我正在使用site中间件,它使用域名检测网站ID。

我希望它有助于某人:)