Skip to main content
 首页 » 编程设计

python之Django 教程(使用 Heroku 上的指南), “Please supply the ENGINE value”(是的,我读过其他线程)

2025年05月04日26zhenyulu

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

我正在浏览 Heroku 上的 Django 指南 ( https://devcenter.heroku.com/articles/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")。

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

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

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

请您参考如下方法:

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()