我已经运行了一个Django项目: foo_proj ,我将Django cms集成到这个项目中,因此有些页面包含由Django CMS管理的“内容” ,这已经有效了。
但是,他们使用的是同一个数据库: foo_db ,即:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'foo_db',
'USER': 'root',
'PASSWORD': 'SecRete!',
'HOST': '',
'PORT': '',
}
}
我不确定我是否可以将它们分开,以便它们的身份验证/授权完全分开,用户可以在foo_proj上注册,但是他们无法登录到“ / cms ”,所以我可以控制拥有“ / cms ”编辑权限的受限用户帐户。
我试图使用Django database routes,代码如下:
from django.conf import settings
class foo_projDBRouter(object):
def is_cms_app(self, app_label):
return app_label in ['cms', 'reversion']
def db_for_read(self, model, **hints):
if self.is_cms_app(model._meta.app_label):
return 'cms'
else:
return 'foo_proj'
def db_for_write(self, model, **hints):
if self.is_cms_app(model._meta.app_label):
return 'cms'
else:
return 'foo_proj'
def allow_relation(self, obj1, obj2, **hints):
if not self.is_cms_app(model._meta.app_label):
return True
return None
def allow_migrate(self, db, model):
return True
在我的设置中:
DATABASE_ROUTERS = ['foo_proj.db_route.FooProjDBRouter']
DATABASES = {
'default': {},
'foo_proj': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'adsk_foo_proj',
'USER': 'root',
'PASSWORD': 'Secret!',
'HOST': '',
'PORT': '',
},
'cms': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cms',
'USER': 'root',
'PASSWORD': 'Secret!',
'HOST': '',
'PORT': '',
}
}
我没有让它适合我,我怀疑这是否会起作用?对此有何建议?
目标是为我的foo_proj和django cms分隔数据库,但在用户导航到foo_proj中的页面时动态呈现CMS内容。
实际上在官方文档页面上http://django-cms.readthedocs.org/en/support-3.0.x/how_to/integrate.html#databases,它提到:“要有效地使用django CMS,我们建议:为django CMS创建一个单独的数据库以供使用。”,但它似乎没有关于如何分离数据库的进一步详细信息。
答案 0 :(得分:0)
我运动的一个问题是您的数据库配置,以下是必需的。 (见#REQUIRED)
DATABASES = {
'default': {}, # REQUIRED
'foo_proj': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'adsk_foo_proj',
'USER': 'root',
'PASSWORD': 'Secret!',
'HOST': '',
'PORT': '',
},
'cms': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cms',
'USER': 'root',
'PASSWORD': 'Secret!',
'HOST': '',
'PORT': '',
}
}
答案 1 :(得分:0)
您的allow_relation
方法调用model
,这是未定义的。您可以使用它(来自Django docs):
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the auth app is involved.
"""
if obj1._meta.app_label == 'auth' or \
obj2._meta.app_label == 'auth':
return True
return None