将Django CMS集成到当前的Django项目中,但使用分开的两个数据库

时间:2015-02-12 20:12:06

标签: python mysql django

我已经运行了一个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创建一个单独的数据库以供使用。”,但它似乎没有关于如何分离数据库的进一步详细信息。

2 个答案:

答案 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