[英]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.