姜戈。南。赫罗库。键错误:'默认'

Posted

技术标签:

【中文标题】姜戈。南。赫罗库。键错误:\'默认\'【英文标题】:Django. South. Heroku. KeyError: 'default'姜戈。南。赫罗库。键错误:'默认' 【发布时间】:2014-07-20 19:35:24 【问题描述】:

我是 Heroku 的新手,所以我尝试按字面意思按照说明进行操作,但我迷失了这个错误。 因此,当我包含在“Heroku 上的 Django 入门”中编写的 settings.py 配置时,我无法再运行本地服务器,除非我从已安装的应用程序中注释掉 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.

requirements.txt:

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

【问题讨论】:

这里少了点什么。您的设置文件的结构是什么? @Yuval,您认为缺少哪些额外信息?我没有拆分我的 settings.py,它全部在一个文件中。我应该在我的 settings.py 中包含所有设置吗? 【参考方案1】:

当您在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,如果不在则返回False

编辑:

它有点乱,但如果你想把它全部保存在一个文件中,你可以执行以下操作:

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

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

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

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 正常工作。

【讨论】:

感谢您的回答。我尝试声明 DATABASE_URL 变量,但仍然遇到相同的错误。在按照您的建议注释掉 South 后,我尝试运行 syncdb,我在编辑中包含了“配置不当”错误。如果声明 DATABASE_URL 变量不起作用,如何检查我是否在 Heroku? @alejoss 编辑了上面的答案以解决您的问题。 很好的答案。 +1 详细解释!!

以上是关于姜戈。南。赫罗库。键错误:'默认'的主要内容,如果未能解决你的问题,请参考以下文章

姜戈。登录表单的错误消息

姜戈。查询。用引号转义字符串错误

关闭终端后不退出“连接被拒绝”错误。姜戈 1.8

姜戈。非 ascii 字段不会创建 slug。我希望得到音译,但得到一个空字段和错误

您是不是忘记注册或加载此标签?姜戈

姜戈。从表单对象访问模板中的外键字段