【问题标题】:Django tutorial (using the guide on Heroku), “Please supply the ENGINE value” (yes, I've read other threads)Django 教程(使用 Heroku 上的指南),“请提供 ENGINE 值”(是的,我已阅读其他主题)
【发布时间】:2013-01-23 19:18:12
【问题描述】:

我已经阅读了很多类似的问题,并且我花了很多时间试图自己解决这个问题,但我仍然陷入困境。这是我的情况:

我正在浏览 Heroku (https://devcenter.heroku.com/articles/django) 上的 Django 指南。我最初是从 windows 开始的,但是在遇到各种问题后,我决定切换到 linux 会容易得多。我擦了擦硬盘,并排安装了 Ubuntu 12.10 和 Win 7 以实现双启动。一切都已经用 pip 安装了(同样,遵循 Heroku 指南)。我正在使用 PostgreSQL,因为它(据说)与 Heroku 很好地集成了。在我开始尝试之前,这里是错误(它来自接近教程的结尾):

(venv)wtodom@wubuntu:~/hellodjango$ python manage.py syncdb
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 371, in handle
    return self.handle_noargs(**options)
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 57, in handle_noargs
    cursor = connection.cursor()
  File "/home/wtodom/hellodjango/venv/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.

如果我尝试使用其绝对路径指定设置文件以确保它使用正确的路径,我会得到:

(venv)wtodom@wubuntu:~/hellodjango$ python manage.py syncdb --settings=/home/wtodom/hellodjango/hellodjango/settings.py
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 261, in fetch_command
    klass = load_command_class(app_name, subcommand)
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 69, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 8, in <module>
    from django.core.management.sql import custom_sql_for_model, emit_post_sync_signal
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/core/management/sql.py", line 6, in <module>
    from django.db import models
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/db/__init__.py", line 11, in <module>
    if DEFAULT_DB_ALIAS not in settings.DATABASES:
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner
    self._setup()
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
    self._wrapped = Settings(settings_module)
  File "/home/wtodom/hellodjango/venv/local/lib/python2.7/site-packages/django/conf/__init__.py", line 95, in __init__
    raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
ImportError: Could not import settings '/home/wtodom/hellodjango/hellodjango/settings.py' (Is it on sys.path?): Import by filename is not supported.

很多类似的问题都让人们编辑了错误的 settings.py 文件。我知道我编辑了正确的。这是它的一只猫(因为它有点长)-https://gist.github.com/wtodom/4736303。对于其中的数据,我已经尝试了所有我能想到的组合,包括空字符串 - 没有区别。

我读过的其他帖子有人对他们运行的 Django 版本有问题。我的是全新​​安装的,所以不是这样。

有些人遇到了 Django 不在路上的问题。如果我从项目根目录打开一个 python shell,我可以导入东西,所以不是这样。

有些人的 settings.py 文件中没有值,但从要点可以看出,我有。我还尝试在 pgadmin 运行和登录的情况下运行命令 (python manage.py syncdb)。

关于这一点,这里是 pgadmin 的屏幕截图,显示我已经创建并更新了数据库:http://i.imgur.com/CXD2AWo.png

这是我在 PostgreSQL 中 \l 时得到的结果(自从 SO 杀死格式后的另一个要点):https://gist.github.com/wtodom/4736359

当我在这里时,这里有一个 \du 列表:https://gist.github.com/wtodom/4736442

我确保我的 manage.py 中包含 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hellodjango.settings")

Heroku 教程中的所有内容都可以在 Ubuntu 中顺利运行,直到我尝试在本地同步数据库 (python manage.py syncdb)。我可以通过 heroku 运行相同的命令,它运行良好 (heroku run python manage.py syncdb)。

我确定我可能忘记了一些我尝试过或阅读过的相关内容。我花了大约 6 个小时阅读并试图让这件事继续下去,就在这个错误上。我真的不知道还能尝试什么。

另外,我对数据库和非 .NET Web 开发非常陌生(我从事过项目,但从未设置过),所以如果您知道我的设置有什么问题,请尽量弄清楚。非常感谢!

【问题讨论】:

  • 为确保您使用正确的设置文件,您需要指定模块(不是文件的绝对路径):./manage.py syncdb --settings=hellodjango.settings 但是,我认为这不是您的问题 - 更有可能与 settings.py 底部的这一行有关:DATABASES['default'] = dj_database_url.config()。如果删除它会发生什么?
  • @NathanJhaveri 指定这样的设置文件不会改变任何东西。删除 dj_database_url() 行可以使命令正常工作,但是由于建议使用 dj_databse_url 模块,所以我不确定现在会发生什么变化。当我运行foreman start 时,我收到了一些警告,所以我现在必须研究它们,看看它们是关于什么的(链接到我第二次尝试运行它:gist.github.com/wtodom/4738716).I'll 做一些阅读并希望能够弄清楚。感谢您的建议(如果您有更多建议,请告诉我!)。
  • 所以我们知道它与 DATABASES['default'] = dj_database_url.config() 行有关。 Settings.py 只是 python,因此您可以调试它或在第 160 行执行 print DATABASES['default'] 并查看 DATABASE 配置是否符合您的预期。您可以使用正在使用的实际数据库配置进行更新吗?
  • @NathanJhaveri 抱歉耽搁了。我实际上决定从一个不同的教程重新开始。我认为我对 wevdev、Django 或数据库不够熟悉,无法从 Heroku 入门指南中获得很多信息,因此我决定从官方 Django 教程开始,然后从那里开始学习。我也切换到 MySQL。到目前为止,一切进展顺利,尽管数据库设置仍然很混乱。
  • 别担心,我知道开始可能会令人生畏。 Django 是一个很棒的框架,从长远来看可能会让你的生活更轻松,所以坚持下去。

标签: python django web-applications heroku


【解决方案1】:

Heroku 和您的本地计算机通常需要不同的数据库设置。一种常见的处理方法是首先在 settings.py 文件中列出您的本地数据库设置,然后检查您的代码当前是否在 Heroku 上运行,如果是,则使用 Heroku 需要的内容覆盖您的数据库设置.这允许单个 settings.py 文件在两种环境中工作。

Heroku 创建一个名为 DATABASE_URL 的环境变量,其中包含数据库 URL 字符串。检查您的代码是否在 Heroku 上运行的常用方法是检查该环境变量。然后,如果存在,请使用 dj_database_url 模块,该模块知道如何将该字符串解析到 Django 配置所需的字典中。

您的代码中唯一不正确的是您在调用 dj_database_url.config() 之前没有先检查环境变量。这意味着通常只能在 Heroku 中运行的 dj_database_url 也在您的本地计算机上运行。由于您的本地计算机几乎可以肯定没有设置 DATABASE_URL 环境变量,因此 dj_database_url 返回一个空字典。因此,当您的代码未在 Heroku 上运行时,它会使用空字典覆盖您的本地数据库配置。 Django 在该字典中查找它需要的信息,但找不到它并引发错误。

要解决此问题,请在使用 dj_database_url 之前添加对 DATABASE_URL 的检查。

在settings.py的最后修改这部分:

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

到这里:

if os.environ.get('DATABASE_URL', None):
    import dj_database_url
    DATABASES['default'] = dj_database_url.config()

【讨论】:

  • 我真的很感激这个答案,但不幸的是我早就离开了这个项目。还是谢谢!
  • 当然。我看到帖子很旧,但如果您或其他任何人再次遇到此问题,请提供答案并没有什么坏处。
  • 当然。我会接受答案,以使其对搜索的人更明显,但是当我还没有真正检查它是否对我有用时,这样做似乎有点偏离。 所以,对于任何寻找的人 - 这可能会解决问题,但我自己还没有测试过。
  • 这个答案非常有帮助。小提示:此条件可能需要应用于块中的一些其他语句 heroku 提供添加到 settings.py。您需要仔细审核其余设置的意义和意义,但它可以工作,这是一个关键部分。
猜你喜欢
  • 2012-08-03
  • 2017-10-20
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2011-06-03
  • 2021-12-30
  • 1970-01-01
  • 2015-02-25
相关资源
最近更新 更多