繁体   English   中英

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

[英]Django-CMS: Multiple domains on same project

我正试图在两个不同的域上运行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开箱即用?

科林

为什么要静态设置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创建两个站点或使用fixture(假设您通过这些项目共享数据库,您只需要执行一次)。

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

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

我们需要保持SITECMS_LANGUAGES之间的关系

例如,我有两个站点ID为1的站点abc.com ,站点ID为2的xyz.com

所以你需要在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。

我希望它有助于某人:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM