2

Heroku 似乎更喜欢部署的应用程序具有一定的结构,主要是 .git 和 manage.py 位于根级别,其他所有内容都低于此级别。

我继承了一个我试图部署用于测试目的的 Django 应用程序,但我认为我无法对其进行重组,所以我想知道我是否有替代方案。

我继承的结构在根文件夹中有大部分文件:

./foo: 
  __init__.py, 
  .git, 
  Procfile, 
  settings.py, 
  manage.py, 
  bar/
    models.py, etc

从 foo 我可以运行python manage.py shell并在那里from foo.bar import models工作。

但是,当我将其推送到 Heroku 时,它会将根放入,/app因此foo变得不再有效。appfrom foo.bar import models

是否有任何神奇的设置可以让我表明这app是真的foo,并允许我在不重构应用程序结构和/或所有导入的情况下继续?

类似的问题:我认为我的问题类似于Heroku - Django: 必须改变每一个提到的内容myproject才能app让我的网站正常工作。将来如何最好地避免这种情况?,除了我问我是否可以在不更改站点结构的情况下做任何事情。

4

2 回答 2

0

您可以尝试向 manage.py 添加一行来修改 sys.path 以确保它foo在您的路径中:

import sys

PROJECT_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
if PROJECT_DIR not in sys.path:
    sys.path.insert(0, PROJECT_DIR)

尽管作为旁注,让您的顶级目录成为 python 模块并不是很好的 django 风格,正是因为它使部署更加复杂(我不认为上述内容适用于 heroku)。我可能会建议您将代码更改为bar直接导入并删除foo/__init__.py.

于 2013-01-22T00:57:26.317 回答
0

最简单的方法是删除foo/__init__.py和修改您的 import 语句以 import frombar而不是 from foo,例如

from foo.bar.models import * 

变成

from bar.models import *

或者,您可以使用相对导入。所以如果你想 import bar.modelsin bar.views,你会做

from .models import *

这是一个问题的原因是 Django 1.4 更改了新创建项目的文件夹结构。在 1.4 之前,您将拥有与您描述的类似的结构,减号foo/__init__.py。Heroku 改编了 Django 1.4 的项目结构,这可以说是更好的,因为它封装了项目中的设置并使其更具可移植性。

于 2013-01-22T17:38:15.670 回答