0

Heroku の複数のアプリで同じ django コードベースを使用しています。私のセットアップでは、git master ブランチと、個別のドメインごとに個別のブランチを使用しています。ただし、アプリごとに異なる設定変数を保存するという理想的なソリューションに苦労しています。

私は、環境変数にそれらを格納するルートをたどり、heroku のアプリごとに分けました。これは理想的なソリューションでした。ただし、現在、各アプリの設定を知る必要があるアプリでローカルでのみ実行している 1 つまたは 2 つの管理機能があります。これは、すべてのアプリ環境で各アプリのすべての設定を保存する必要があることを意味します。例えば:

それ以外の

site_email=blah@site.com

私は次のようになります:

site1_email=blah@site1.com
site2_email=blah@site2.com

等々...

私はこれを行うことができましたが、それは私にはかなり面倒です。代替手段はありますか?問題のある機能を取り除いて独自のアプリに組み込むこともできますが、アプリの設定を互いに隠すだけでも大変な作業のようです。

4

2 に答える 2

3

次のアプリ設定が与えられた場合:

/Project/
    /app1/
    /app2/
    /project/ (the project app that gets auto created in Django 1.4+)
        /settings/
            __init__.py <- general site inspecific settings
            sitea.py <- site A's specific settings
            siteb.py <- site B's specific settings

内部sitea.pyにサイト固有の設定を配置します(os.environ.get()呼び出しを使用して、herokuに保存された設定を使用できます)。

# Default Django settings for project.
from project.settings import * 

DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)
MANAGERS = ADMINS
ALLOWED_HOSTS = []
MEDIA_ROOT = ''
STATIC_ROOT = ''

次に、heroku実行/起動スクリプトで同等のことを行います(gunicornまたはその他の本番djangoサーバーを使用すると仮定します)

python manage.py runserver --settings=project.settings.sitea

更新 -Project/project/settings/production.pyファイルの例、注意: すべての機密情報は、ファイルからではなく環境から読み取られます。

from project.settings import *

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    ('Francis', 'francis@teamcolab.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': os.environ.get('MYSQL_DATABASE'),                      # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': os.environ.get('MYSQL_USER'),
        'PASSWORD': os.environ.get('MYSQL_PASSWORD'),
        'HOST': os.environ.get('MYSQL_HOST'),                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': os.environ.get('MYSQL_PORT'),                      # Set to empty string for default.
    }
}

REDIS = {
    'HOST' : os.environ.get('REDIS_HOST'),
    'PASSWORD' : os.environ.get('REDIS_PASSWORD', None),
    'PORT' : int(os.environ.get('REDIS_PORT', 6379)),
    'DB' : int(os.environ.get('REDIS_DB', 0)),
}

WEBSOCKET_URL = os.environ.get('WEBSOCKET_URL')

# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
ALLOWED_HOSTS = ['XX.com','production.XX.com','www.XX.com',]

SESSION_COOKIE_DOMAIN = '.XX.com'

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/var/www/example.com/media/"
MEDIA_ROOT = os.environ.get('MEDIA_ROOT')

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/var/www/example.com/static/"
STATIC_ROOT = os.environ.get('STATIC_ROOT')
于 2013-09-09T14:07:46.007 に答える
0

The Motley Fool でのやり方は次のとおりです。

環境ごとに 1 つずつ、複数の設定ファイルがあります。

defaults.pyすべての環境の「ストック」である設定ファイルがあります。

などtesting.py、環境ごとに設定ファイルがあります。live.py

これらには、デフォルト (または必要に応じて完全に異なる設定) からの変更が含まれています。

Fabric + 内部デプロイヤを使用して、適切な設定ファイルを適切な環境にデプロイします。

次のような fabfile があります (簡略化)。

@task @def test():
    """sets environment to test"""
    set_hosts(['testserver01.test.com', 'testserver02.test.com']) #servers to deploy to
    env.environment = 'testing'

環境の作成をスクリプト化する内部デプロイヤがあります。

def setup():
    from fabric.api import cd, env
    with cd(env.checkout):
        env.run('python create_manage_script.py %s' % env.environment)

デプロイすると、次のようになります。

  • ユーザーが実行しますfab {{environment}} deploy
  • デプロイヤは設定ディレクトリを見て、環境名 (testing/live/etc) に一致する設定ファイルを探します。
  • デプロイヤは適切なコマンドをファブリックに送信します。
  • Fabric はそのサーバーにコードをデプロイし、サーバーを正しい設定ファイルにポイントします。

3 つの異なる環境 (開発、テスト、ライブ) があり、これら 3 つの異なる環境を使用する 3 つの異なるアプリがあることに注意することが重要です。

于 2013-09-09T13:44:21.697 に答える