为什么Heroku上的Django站点需要不同的导入路径?

时间:2012-09-12 13:56:29

标签: django heroku

我有一个Django 1.4网站,我一直在本地开发(OS X 10.8.1)。它工作正常。但我现在正试图在Heroku上进行设置,而且无法从我的应用程序中导入模块。

结构是这样的:

manage.py
projectname/
    __init__.py
    appnameone/
    appnametwo/
    settings/
    static/
    wsgi.py
requirements.txt

在我的设置中,我使用项目名称包含我自己的应用程序,如下所示:

INSTALLED_APPS = (
    ...
    'projectname.appnameone',
    'projectname.appnametwo',
    ...
)

当我导入模块时,我没有项目名称,例如:

from appnameone.models.model_name import ModelName

这在本地工作正常,但是当我尝试在Heroku上运行任何东西(例如syncdb)时,我从上面的行中得到ImportError。如果我将项目名称添加到import语句,似乎它可以工作,如下所示:

from projectname.appnameone.models.model_name import ModelName

但这对我的本地环境无效。

我想这与路径有关,但我不确定是什么。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

当我认为这在我的本地环境中不起作用时:

from projectname.appnameone.models.model_name import ModelName

我想我必须遇到其他一些问题。因为已经通过并更新了我的应用程序的所有导入以作为项目名称的前缀,它现在可以在我的本地环境和Heroku上工作。

This answer很好地解释了将您的应用与您的项目放在同一级别(在这种情况下导入不需要项目名称前缀)和将您的应用置于您的项目(在这种情况下需要项目名称前缀)。

听起来像问题中描述的我的本地环境应该不起作用,因为我的应用程序在项目中,但我没有这样导入它们。我猜我的Python路径非常宽松,并且当它不应该让我逃脱时。

更新:我意识到了最终的原因。在使用virtualenv和virtualenvwrapper进行设置期间,我做了类似这样的事情:

$ add2virtualenv ~/Projects/clientname/django-projectname/projectname

这增加了我的PYTHONPATH,这让我的环境非常宽容。在Heroku上,情况并非如此(至少,不是默认情况下;也许可以调整它)。一旦我从virtualenv目录中的lib/python2.7/site-packages/virtualenv_path_extensions.pth删除了额外的路径,那么我就开始得到与Heroku相同的错误。这意味着我可以更好地修复它们!