【问题标题】:how to define Django settings without default DB settings?如何在没有默认数据库设置的情况下定义 Django 设置?
【发布时间】:2016-09-14 06:39:50
【问题描述】:

根据 Django Docs,我们可以定义像 {} 这样的空 django 设置,但它仍然会引发错误。

在 / 处配置不当 settings.DATABASES 配置不正确。请提供 ENGINE 值。查看设置文档了解更多详情。

"""
Django settings for impactFund project.

For more information on this file, see
https://docs.djangoproject.com/en/1.6/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.6/ref/settings/
"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
PROJECT_PATH = os.path.split(os.path.abspath(os.path.dirname(__file__)))[0]


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 's^(gvcg1_!!!8wnpikp[hj4+%ypay1$zsf54=j6o3cuuxigjxiscqno'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

TEMPLATE_DEBUG = True

ALLOWED_HOSTS = ['*']


# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.humanize',
    'Ken_app',
    'app',

    'captcha',
    'django.contrib.sites',
    'treebeard',
    'djangocms_text_ckeditor',    
    'cms',  # django CMS itself
    'mptt',  # utilities for implementing a modified pre-order traversal tree
    'menus',  # helper for model independent hierarchical website navigation
    #'south',  # intelligent schema and data migrations
    'sekizai',  # for javascript and css management
    'djangocms_admin_style',  # for the admin skin. You **must** add 'djangocms_admin_style' in the list **before** 'django.contrib.admin'.
     # to enable messages framework (see :ref:`Enable messages <enable-messages>`)

)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.gzip.GZipMiddleware',

    'cms.middleware.user.CurrentUserMiddleware',
    'cms.middleware.page.CurrentPageMiddleware',
    'cms.middleware.toolbar.ToolbarMiddleware',
    'cms.middleware.language.LanguageCookieMiddleware',    

)

ROOT_URLCONF = 'Fundimpact.urls'

WSGI_APPLICATION = 'Fundimpact.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases


DATABASES = {

    'default': {  # Leave this blank, we do not want a 'default' database defined.
        'ENGINE': '', 
        'NAME': '',
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    },


    'prisen_db':{
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'prisen_db',                      
        'USER': 'prmken_user',                      
        'HOST': '59.77.142', 
        'PASSWORD':'PmN7&#5B',    

    },
    'prism_db':{
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'prism_db',                      
        'USER': 'prism_user',                      
        'HOST': '59.77.142', 
        'PASSWORD':'PC$MN',    

    }
 }   



DATABASE_ROUTERS = ['app.dbRouter.AppDBRouter', 'Ken_app.dbRouter.Ken_appDBRouter']

TEMPLATES = [
   {
       'BACKEND': 'django.template.backends.django.DjangoTemplates',
       'DIRS': [
       os.path.join(PROJECT_PATH, 'Ken_app','template'),
       os.path.join(PROJECT_PATH, 'app','templates'),
                ],
       'APP_DIRS': True,
       'OPTIONS': {
           'context_processors': [
               'django.template.context_processors.debug',
               'django.template.context_processors.request',
               'django.contrib.auth.context_processors.auth',
               'django.contrib.messages.context_processors.messages',
               'django.core.context_processors.i18n',              
               'django.core.context_processors.static',
               'sekizai.context_processors.sekizai',
           ],
       },
   },
]


# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/

LANGUAGE_CODE = 'en-us'

#FILE_CHARSET = ""

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.6/howto/static-files/

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)



CKEDITOR_SETTINGS = {
    'language': '{{ language }}',
    'toolbar': 'CMS',
    'skin': 'moono',
}


CMS_PLACEHOLDER_CONF = {
    'content': {
        'plugins': ['TextPlugin', 'LinkPlugin'],
        'default_plugins':[
            {
                'plugin_type':'TextPlugin',
                'values':{
                    'body':'<p>Great websites : %(_tag_child_1)s and %(_tag_child_2)s</p>'
                },
                'children':[
                    {
                        'plugin_type':'LinkPlugin',
                        'values':{
                            'name':'django',
                            'url':'https://www.djangoproject.com/'
                        },
                    },
                    {
                        'plugin_type':'LinkPlugin',
                        'values':{
                            'name':'django-cms',
                            'url':'https://www.django-cms.org'
                        },
                    },
                ]
            },
        ]
    }
}

这些是我的两个应用程序的路由器,它们位于单独的应用程序文件夹中

import random

class Ken_appDBRouter(object):
    """
    A router to control app db operations
    """
    def db_for_read(self, model, **hints):
        "Point all operations on app models to 'kenya"
        from django.conf import settings
        if not settings.DATABASES.has_key('Ken_app'):
            return None
        if model._meta.app_label == 'Ken_app':
            return 'prisen_db'
        return None

    def db_for_write(self, model, **hints):
        "Point all operations on app1 models to 'kenya'"
        from django.conf import settings
        if not settings.DATABASES.has_key('Ken_app'):
            return None
        if model._meta.app_label == 'Ken_app':
            return 'prisen_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        "Allow any relation if a model in app is involved"
        from django.conf import settings
        if not settings.DATABASES.has_key('Ken_app'):
            return None
        if obj1._meta.app_label == 'Ken_app' or obj2._meta.app_label == 'Ken_app':
            return True
        return None

    def allow_syncdb(self, db, model):
        "Make sure the Ken_app app only appears on the 'kenya' db"
        from django.conf import settings
        if not settings.DATABASES.has_key('Ken_app'):
            return None
        if db == 'prisen_db':
            return model._meta.app_label == 'Ken_app'
        elif model._meta.app_label == 'Ken_app':
            return False
        return None


import random

class AppDBRouter(object):
    """
    A router to control app db operations
    """
    def db_for_read(self, model, **hints):
        "Point all operations on app models to 'app'"
        from django.conf import settings
        if not settings.DATABASES.has_key('app'):
            return None
        if model._meta.app_label == 'app':
            return 'prism_db'
        return None

    def db_for_write(self, model, **hints):
        "Point all operations on app1 models to 'india'"
        from django.conf import settings
        if not settings.DATABASES.has_key('app'):
            return None
        if model._meta.app_label == 'app':
            return 'prism_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        "Allow any relation if a model in app is involved"
        from django.conf import settings
        if not settings.DATABASES.has_key('app'):
            return None
        if obj1._meta.app_label == 'app' or obj2._meta.app_label == 'app':
            return True
        return None

    def allow_syncdb(self, db, model):
        "Make sure the app app only appears on the 'app' db"
        from django.conf import settings
        if not settings.DATABASES.has_key('app'):
            return None
        if db == 'prism_db':
            return model._meta.app_label == 'app'
        elif model._meta.app_label == 'app':
            return False
        return None

这里是追溯。 enter image description here

【问题讨论】:

  • 想告诉我们错误是什么?..
  • 我们应该神奇地找出我们的精神力量出了什么问题。但我需要先头疼,谢谢。
  • ImproperlyConfigured at / settings.DATABASES 配置不正确。请提供 ENGINE 值。查看设置文档了解更多详情。
  • 当您使用默认(空)后端时发生此错误,而不是在您定义它时。请提供完整的回溯和相关代码。
  • 但是当我使用默认值时:{} 会引发同样的错误,我无法删除默认值,因为即使不使用它也必须存在。

标签: django


【解决方案1】:

您的default 数据库不为空:

'default': {  # Leave this blank, we do not want a 'default' database defined.
    'ENGINE': '', 
    'NAME': '',
    'USER': '',
    'PASSWORD': '',
    'HOST': '',
    'PORT': '',
},

改成

'default': {},

此外,您缺少auth 的路由。将您的一个路由器更改为也接受 auth 或为其添加第三个路由器。

【讨论】:

  • 错误是 ImproperlyConfigured at / settings.DATABASES 配置不正确。请提供 ENGINE 值。查看设置文档了解更多详情。
  • 我对数据库路由不太熟悉,但您似乎缺少auth 应用程序的路由。对于auth,您的两个路由器似乎都返回None,在这种情况下,Django 将恢复为default
  • 我猜你在 Docs 中找到了它,其中路由器是为同一个应用程序定义的,其中 auth 表将转到 auth_db 并休息到副本(db),但在我的情况下,我有 2 个不同的应用程序和 2 个不同的数据库1 个项目。
  • 没关系。 auth是一个和你自己的两个app一样的app,同样需要一个数据库。所以你需要修改你的一个路由器来接受auth或者为它添加第三个路由器。
  • 你的意思是像 auth 是一个预定义的类,它路由所有与身份验证相关的表,因为这样我需要 4 个路由器,2 个用于非身份验证相关,2 个用于身份验证相关
【解决方案2】:

超越内部检查机制:

# We wont use Django databases
DATABASES = {
    'default': {
        'ENGINE': '',
    }
}

# Override TestRunner methods
TEST_RUNNER = 'tests.NoSQLTestRunner'

你将创建另一个 tests.py 文件并保存下面的内容

from django.test.simple import DjangoTestSuiteRunner
from django.test import TestCase

class NoSQLTestRunner(DjangoTestSuiteRunner):
    def setup_databases(self):
        pass
    def teardown_databases(self, *args):
        pass

class NoSQLTestCase(TestCase):
    def _fixture_setup(self):
        pass
    def _fixture_teardown(self):
        pass

【讨论】:

  • 因为我有多个应用程序,我需要在哪里添加这个文件?
  • 此文件将与设置文件在同一文件夹中
猜你喜欢
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 2010-12-11
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多