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にpushするとroot化してしまい、 になってしまい動かなく/appなりfooました。appfrom foo.bar import models

appそれが本当にそうであることを示しfoo、アプリの構造やすべてのインポートをリファクタリングせずに続行できるようにする魔法の設定はありますか?

同様の質問: 私の質問はHeroku - Djangoに似ていると思います: サイトを機能myprojectさせるには、すべての言及をに変更する必要がありappました。今後これを回避するにはどうすればよいですか?ただし、サイト構造を変更せずに何かできることはないかと尋ねているだけです。

4

2 に答える 2

0

sys.path を変更する行を manage.py に追加して、それ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

The easiest way would be to delete foo/__init__.py and modify your import statements to import from bar instead of from foo, eg

from foo.bar.models import * 

becomes

from bar.models import *

Alternatively you can use relative imports. So if you wanted to import bar.models in bar.views, you'd do

from .models import *

The reason this is an issue is that Django 1.4 changed folder structure for newly created projects. Before 1.4 you'd have a similar structure like you described, minus foo/__init__.py. Heroku adapted Django 1.4's project structure, which is arguably better because it encapsulates the settings within the project and makes it more portable.

于 2013-01-22T17:38:15.670 に答える