【问题标题】:How to deal with heroku renaming my root-level app?如何处理 heroku 重命名我的根级应用程序?
【发布时间】:2013-01-21 21:05:02
【问题描述】:

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? 类似,只是我问的是在不更改站点结构的情况下是否可以做些什么。

【问题讨论】:

  • 你的 procfile 中有什么?
  • Procfile web: python manage.py runserver 0.0.0.0:$PORT --noreload

标签: django heroku


【解决方案1】:

您可以尝试在 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。

【讨论】:

    【解决方案2】:

    最简单的方法是删除foo/__init__.py 并修改您的导入语句以从bar 导入而不是从foo 导入,例如

    from foo.bar.models import * 
    

    变成

    from bar.models import *
    

    您也可以使用relative imports。所以如果你想在bar.views 中导入bar.models,你会这样做

    from .models import *
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-03
      • 2016-10-29
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      相关资源
      最近更新 更多