[英]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.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]
經過幾個小時的反復試驗,我得到了以下解決方案。
我們需要保持SITE
和CMS_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.