Wes*_*dom 1 python django web-applications heroku
我已经阅读了很多类似的问题,而且我花了很多时间尝试自己解决这个问题,但我仍然陷入困境.这是我的情况:
我正在浏览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.
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用其绝对路径指定设置文件以确保它使用正确的路径,我得到这个:
(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.
Run Code Online (Sandbox Code Playgroud)
很多类似的问题让人们编辑错误的settings.py文件.我知道我编辑了正确的.这是一只它的猫(因为它有点长,所以在gist上) - https://gist.github.com/wtodom/4736303.我已经尝试了我能想到的每一个组合数据,包括空字符串 - 没有区别.
我读过的其他帖子让人们对他们运行的Django版本有疑问.我是一个彻头彻尾的新装置,所以不是这样.
有些人认为Django不在路上.如果我从项目根目录打开一个python shell我可以导入东西,所以不是这样.
有些人在他们的settings.py文件中没有值,但正如你从gist中看到的,我做到了.我也尝试运行命令(python manage.py syncdb
),无论是否运行pgadmin并登录.
在这方面,这是一个pgadmin的screencap,显示我已经创建了数据库:http://i.imgur.com/CXD2AWo.png
这是我在PostgreSQL中获得的东西(自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中顺利运行,直到我尝试在本地同步db(python manage.py syncdb).我可以通过heroku运行相同的命令,它工作正常(heroku run python manage.py syncdb
).
我敢肯定,我已经忘记了我尝试或阅读过的相关内容.我花了大约6个小时阅读并试图让这件事情继续下去,就这一个错误而言.我真的不知道还有什么可以尝试的.
另外,我对数据库和非.NET Web开发都很陌生(我曾经从事过项目,但从未设置过),所以如果你知道我的设置有什么问题,请尽量清楚.非常感谢你!
Heroku和您的本地机器通常需要不同的数据库设置.处理这种情况的常用方法是首先在settings.py文件中列出本地数据库设置,然后检查您的代码当前是否在Heroku上运行,如果是,请使用Heroku需要覆盖数据库设置.这允许单个settings.py文件在两个环境中都可以工作.
Heroku创建一个名为DATABASE_URL的环境变量,其中包含数据库URL字符串.检查代码是否在Heroku上运行的常用方法是检查该环境变量.然后,如果它存在,请使用dj_database_url模块,该模块知道如何将该字符串解析为Django配置所需的字典.
代码中唯一不正确的是您在调用dj_database_url.config()之前没有先检查环境变量.这意味着dj_database_url(通常只应在Heroku中运行)也在本地计算机上运行.由于您的本地计算机几乎肯定没有设置DATABASE_URL环境变量,因此dj_database_url返回一个空字典.因此,当代码不在Heroku上运行时,您的代码将使用空字典覆盖本地数据库配置.Django在该字典中查找它需要的信息,找不到它,并引发错误.
要解决此问题,请在使用dj_database_url之前添加对DATABASE_URL的检查.
在settings.py的末尾更改此部分:
import dj_database_url
DATABASES['default'] = dj_database_url.config()
Run Code Online (Sandbox Code Playgroud)
对此:
if os.environ.get('DATABASE_URL', None):
import dj_database_url
DATABASES['default'] = dj_database_url.config()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1081 次 |
最近记录: |