【问题标题】:Django-CMS: Multiple domains on same projectDjango-CMS:同一个项目上的多个域
【发布时间】:2013-08-20 07:21:08
【问题描述】:

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

问候科林

【问题讨论】:

    标签: python django python-2.7 django-cms


    【解决方案1】:

    为什么要静态设置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
    • @Hedde van der Heide 我们如何根据输入的 url 为每个站点动态加载相应的 settings.py。
    • @Wirzi 如何根据站点 ID 动态加载 settings_foo.pysettings_bar.py
    • 使用 wsgi.py 文件为每个域加载不同的设置文件。
    • 我在 apache httpd.conf 文件中使用了多个 VirtualHost,并为一个域加载了例如 foo_wsgi.py 和另一个域的 bar_wsgi.py。实时示例:gourmendo.comblog.gourmendo.com
    【解决方案2】:

    如果您的所有域的语言都相同,例如 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]
    

    【讨论】:

      【解决方案3】:

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

      我们需要保持SITECMS_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,
                  },
              ],
          }
      

      我也在使用site 中间件,它使用域名检测站点ID。

      我希望它可以帮助某人:)

      【讨论】:

      • 感谢您的回答。你能告诉我你用的是哪个 SITE 中间件吗?
      猜你喜欢
      • 1970-01-01
      • 2015-01-31
      • 2016-09-08
      • 2012-05-20
      • 2017-01-30
      • 2012-11-28
      • 2016-01-14
      • 2012-09-02
      • 1970-01-01
      相关资源
      最近更新 更多