如何处理heroku重命名我的根级应用程序?

时间:2013-01-21 21:05:02

标签: django heroku

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: Had to change every mentioning of myproject into app to get my site working. How to best avoid this in the future?,除非我在不改变网站结构的情况下询问是否有任何我可以做的事情。

2 个答案:

答案 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的项目结构,这可以说是更好的,因为它封装了项目中的设置并使其更具可移植性。