簡體   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