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
变为app
而from foo.bar import models
不再有效。
是否有任何魔术设置可以让我指出app
确实是foo
并允许我继续而不重构应用结构和/或所有导入?
类似的问题:我认为我的问题类似于Heroku - Django: Had to change every mentioning of myproject
into app
to get my site working. How to best avoid this in the future?,除非我在不改变网站结构的情况下询问是否有任何我可以做的事情。
答案 0 :(得分: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
。
答案 1 :(得分:0)
最简单的方法是删除foo/__init__.py
并修改您的导入语句,以便从bar
而非foo
导入,例如
from foo.bar.models import *
变为
from bar.models import *
或者您可以使用relative imports。因此,如果您要在bar.models
中导入bar.views
,则需要
from .models import *
这是一个问题的原因是Django 1.4改变了新创建项目的文件夹结构。在1.4之前,您将拥有与您描述的类似的结构,减去foo/__init__.py
。 Heroku改编了Django 1.4的项目结构,这可以说是更好的,因为它封装了项目中的设置并使其更具可移植性。