姜戈。南。希罗库。密钥错误: 'default'



我是Heroku的新手,所以我试着按照字面上的说明去做,但是我迷失了这个错误。所以,当我包含了"Getting Started with Django on Heroku"中写的settings.py配置时,我不能再运行本地服务器了,除非我从我的Installed Apps中注释掉South。

错误:

 from south.db import DEFAULT_DB_ALIAS
 File "/home/alejandro/Proyectos/olenv/local/lib/python2.7/site-packages/south/db/__init__.py", line 83, in <module>
 db = dbs[DEFAULT_DB_ALIAS]
 KeyError: 'default'

这是settings.py中的相关设置:

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'dbolib',
    'USER': 'alejandro',
    'PASSWORD': 'zzzzz'
}
}
 # --- HEROKU --- #
 # Parse database configuration from $DATABASE_URL
 import dj_database_url
 DATABASES['default'] = dj_database_url.config()

也许应该是这样,因为South是一个生产工具,因此它与Heroku冲突。也许不会,因为我是Heroku的新手,任何澄清都会有所帮助。

编辑当我注释掉South并尝试运行syncdb时,我得到了这个错误:

File "/home/alejandro/Proyectos/olenv/local/lib/python2.7/site-packages/django/db/backends/dummy/base.py", line 15, in complain
raise ImproperlyConfigured("settings.DATABASES is improperly configured. "
django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.

让:

Django==1.6
South==0.8.4
argparse==1.2.1
dj-database-url==0.3.0
dj-static==0.0.5
django-crispy-forms==1.4.0
django-debug-toolbar==1.2
django-endless-pagination==2.0
django-extensions==1.3.5
django-toolbelt==0.0.1
gunicorn==18.0
psycopg2==2.5.2
pystache==0.5.4
six==1.6.1
sqlparse==0.1.11
static==1.0.2
wsgiref==0.1.2

当您注释掉INSTALLED_APPS中的South时,它是否允许您在本地运行python manage.py syncdb ?

我认为问题是你用你的settings.py中的dj_database_url行覆盖了你的default数据库。当您在Heroku上时,有一个名为DATABASE_URL的环境变量,dj_database_url使用它来配置数据库。但是,如果在本地没有类似的环境变量,则无法正确配置数据库。South抛出错误的原因是因为它试图在初始化时连接到数据库(注意错误是如何来自South的__init__)。如果你试图在注释掉South后实际使用本地数据库,我猜你会得到一个错误。

有两种方法可以解决这个问题。第一种,也是最简单的,是在本地机器上创建一个DATABASE_URL变量。根据上面列出的设置,将DATABASE_URL设置为'postgres://alejandro:zzzzz@localhost/dbolib'。第二种,也是比较困难的,是在设置中添加一些东西来检查您是否在Heroku上,如果不是,则跳过dj_database_url配置。基本上,将dj_database_url行嵌套在if语句的设置中,如果在Heroku上则返回True,如果不在Heroku上则返回False

编辑:

这有点乱,但是如果你想把它们都保存在一个文件中,你可以这样做:

首先,尝试使用dj_database_url设置默认数据库。这意味着将以下代码移动到设置中的DATABASES设置之上:

import dj_database_url
DATABASES = {}
DATABASES['default'] = dj_database_url.config()

这段代码将默认数据库设置为等于dj_database_url的结果。然而,可能不会有结果。您将需要对此进行测试(这将表明本地开发)并相应地设置数据库。因此,在THE PREVIOUS CODE之后,添加以下代码:

if len(DATABASES['default']) == 0:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'dbolib',
            'USER': 'alejandro',
            'PASSWORD': 'zzzzz'
    }
}

检查您的DATABASES['default']中是否有任何内容,如果没有,则使用本地设置设置默认数据库。

这是有点乱,但它会工作。更好的选择可能是使用不同的设置文件,这会增加另一层复杂性。实际上,最好的选择是在所有机器上设置DATABASE_URL环境变量,以便dj_database_url正常工作。

相关内容

最新更新