2

production_settings.py私はすべてのプロダクション環境変数と値を入れているを作成しました。

import dj_database_url
DATABASES['default'] =  dj_database_url.config()

次のようなenv変数を宣言すると思いました

MYPROJECT_PRODUCTION

これを次のように設定します

heroku config:add MYPROJECT_PRODUCTION=Trueまたexport MYPROJECT_PRODUCTION=True

settings.py (これは django によって作成されたデフォルトです) で、ファイルの最後に追加すると思いました

import os
if os.environ.has_key('MYPROJECT_PRODUCTION') and os.environ.get('MYPROJECT_PRODUCTION')=='True':
    from production_settings import *

これはこれを行う正しい方法ですか?

しようとするとインポートエラーが発生しますpython manage shell

export DJANGO_SETTINGS_MODULE='myproject.settings'
export MYPROJECT_PRODUCTION=True
me@ubuntu:~/dev/python/django/myproject$ python manage.py shell
Error: Can't find the file 'settings.py' in the directory containing 'manage.py'. It appears you've customized things.
You'll have to run django-admin.py, passing it your settings module.
(If the file settings.py does indeed exist, it's causing an ImportError somehow.)

manage.py は settings.py と同じフォルダーに存在します ..それでもエラーが発生します。

echo $MYPROJECT_PRODUCTION私はどの出力をチェックしましたかTrue

4

3 に答える 3

1

環境変数を使用して設定をカスタマイズすることを優先して、環境ごとに異なる設定ファイルを使用しないことをお勧めします。これにより、デフォルトでローカルの開発設定を使用して、本番環境で上書きすることができます。

たとえば、データベースと静的/メディア ルートの設定

# Default database URL is a local SQLite instance
DATABASE_URL = 'sqlite:///%s' % os.path.join(os.path.dirname(__file__), 'db.sqlite')

DATABASES = {
    'default': dj_database_url.config('DATABASE_URL', default=DATABASE_URL),
}

MEDIA_ROOT = os.environ.get('MEDIA_ROOT',
                            os.path.join(os.path.dirname(__file__), 'media'))

MEDIA_URL = os.environ.get('MEDIA_URL', '/media/')


STATIC_ROOT = os.environ.get('STATIC_ROOT',
                             os.path.join(os.path.dirname(__file__), 'static'))

STATIC_URL = os.environ.get('STATIC_URL', '/static/')

これにより、Heroku で任意の設定を行うことができheroku config:set、複数の設定ファイルを処理する複雑さが解消されます。次に例を示します。

heroku config:set MEDIA_URL=http://custom-media-server.com/media/
heroku config:set STATIC_URL=http://custom-media-server.com/static/

また、環境変数からほとんどの設定を取得できるカスタムDjango プロジェクト テンプレートも作成しました。

また、 12 Factor Application Web サイト、特に how to store configurationも参照してください。

于 2013-01-22T17:13:58.437 に答える
1

個人的には、プロダクション設定を保持し、ファイルsettings.pyをインクルードしlocal_settings.pyます (.hgignore でリビジョン管理から除外されます)。

settings.py の末尾に以下を追加します。

try:
    from local_settings import *
except ImportError, e:
    pass

次に、local_settings.py で適切な設定を上書きします -

DEBUG = True

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'tag',
        'USER': 'tag',
        'PASSWORD': 'tag',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

私はこれがかなりよく使われている方法であるという印象を受けています (同僚から拾いましたが、ブログでも見たことがあります)。

編集

機密データを非公開に保つために、balazs の非常に良い点に応じて、このメソッドのバリエーションを含めることができます。おそらく、local_settingsインポート後に次を含めます-

try:
    from production_settings import *
except ImportError, e:
    pass

production_settings.py次に、バージョン管理から除外します。展開するには別の方法を使用する必要があるかもしれproduction_settings.pyませんが、それは大したことではないと思います。

于 2013-01-22T07:56:06.517 に答える
0

DATABASESを辞書として定義しましたか?に:

DATABASES = {}

また、 heroku logs

于 2013-01-22T13:42:51.420 に答える