178

私は基本的なアプリを開発しています。展開段階で、ローカル設定と本番設定の両方が必要であることが明らかになりました。

次のことを知っておくとよいでしょう。

  • 開発および本番設定を処理する最善の方法。
  • django-debug-toolbar などのアプリを開発環境のみに保持する方法。
  • 開発と展開の設定に関するその他のヒントとベスト プラクティス。
4

19 に答える 19

142

DJANGO_SETTINGS_MODULE環境変数は、Django がロードする設定ファイルを制御します。

したがって、それぞれの環境用に個別の構成ファイルを作成し (もちろん、それらはimport *個別の「共有設定」ファイルから両方とも可能であることに注意してください)、どちらを使用DJANGO_SETTINGS_MODULEするかを制御するために使用します。

方法は次のとおりです。

Djangoのドキュメントに記載されているように:

DJANGO_SETTINGS_MODULE の値は、mysite.settings などの Python パス構文にする必要があります。設定モジュールは Python インポート検索パス上にある必要があることに注意してください。

したがって、ソース リポジトリにと を作成したmyapp/production_settings.pyと仮定しましょう。myapp/test_settings.py

その場合、それぞれDJANGO_SETTINGS_MODULE=myapp.production_settings前者を使用するように設定しDJANGO_SETTINGS_MODULE=myapp.test_settings、後者を使用するように設定します。


ここから先は、問題はDJANGO_SETTINGS_MODULE環境変数の設定に要約されます。

DJANGO_SETTINGS_MODULEスクリプトまたはシェルを使用した設定

次に、ブートストラップ スクリプトまたはプロセス マネージャーを使用して (環境を設定することにより) 正しい設定を読み込むか、Django を起動する前にシェルから実行しますexport DJANGO_SETTINGS_MODULE=myapp.production_settings

このエクスポートは、シェルからいつでも実行できることに注意してください.bashrc

DJANGO_SETTINGS_MODULEProcess Manager を使用した設定

環境を設定するブートストラップ スクリプトを作成するのが苦手な場合 (そして、そのように感じる十分な理由があります!)、プロセス マネージャーを使用することをお勧めします。


最後に、変数を利用して、設定をまったく別の場所に保存できることに注意してくださいPYTHONPATH(たとえば、運用サーバーでは、に保存します/etc/)。これにより、構成をアプリケーション ファイルから分離できます。それは、アプリの構造によって異なります。

于 2012-05-19T10:36:40.923 に答える
101

デフォルトではプロダクション設定を使用しますが、ファイルとsettings_dev.py同じフォルダーに呼び出されるファイルを作成しsettings.pyます。などのオーバーライドをそこに追加しますDEBUG=True

開発に使用するコンピューターで、これを~/.bashrcファイルに追加します。

export DJANGO_DEVELOPMENT=true

ファイルの最後にsettings.py、次を追加します。

# Override production variables if DJANGO_DEVELOPMENT env variable is set
if os.environ.get('DJANGO_DEVELOPMENT'):
    from settings_dev import *  # or specific overrides

(通常、Python ではインポート*を避けるべきであることに注意してください)

デフォルトでは、本番サーバーは何もオーバーライドしません。終わり!

他の回答と比較して、これは更新を必要としないため、または一度に1つのdjangoプロジェクトでのみ作業できるPYTHONPATH設定を必要としないため、より単純です。DJANGO_SETTINGS_MODULE

于 2016-01-20T04:39:44.677 に答える
38

私は通常、環境ごとに1つの設定ファイルと、共有設定ファイルを持っています。

/myproject/
  settings.production.py
  settings.development.py
  shared_settings.py

私の各環境ファイルには次のものがあります。

try:
    from shared_settings import *
except ImportError:
    pass

これにより、必要に応じて共有設定を上書きできます(そのスタンザの下に変更を追加することにより)。

次に、settings.pyにリンクして、使用する設定ファイルを選択します。

ln -s settings.development.py settings.py
于 2012-05-19T11:28:31.033 に答える
37

これは、6つの簡単なステップで行う方法です。

  1. プロジェクト ディレクトリ内にフォルダーを作成し、名前を付けますsettings

    プロジェクトの構造:

    myproject/
           myapp1/
           myapp2/              
           myproject/
                  settings/
    
  2. settingsディレクトリ内__init__.pybase.py、、、dev.pyおよび4 つの python ファイルを作成します。prod.py

    設定ファイル:

    settings/
         __init__.py
         base.py
         prod.py
         dev.py 
    
  3. 開い__init__.pyて、次の内容を入力します。

    初期化.py:

    from .base import *
    # you need to set "myproject = 'prod'" as an environment variable
    # in your OS (on which your website is hosted)
    if os.environ['myproject'] == 'prod':
       from .prod import *
    else:
       from .dev import *
    
  4. 開いbase.pyて、すべての一般的な設定 (本番環境と開発環境の両方で使用されます) を入力します。次に例を示します。

    base.py:

    import os
    ...
    INSTALLED_APPS = [...]
    MIDDLEWARE = [...]
    TEMPLATES = [{...}]
    ...
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    MEDIA_ROOT = os.path.join(BASE_DIR, '/path/')
    MEDIA_URL = '/path/'
    
  5. dev.pyたとえば、開発固有のものを開いて含めます。

    dev.py:

    DEBUG = True
    ALLOWED_HOSTS = ['localhost']
    ...
    
  6. prod.pyたとえば、本番固有のものを開いて含めます。

    prod.py:

    DEBUG = False
    ALLOWED_HOSTS = ['www.example.com']
    LOGGING = [...]
    ...
    
  7. (ANDRESMA のコメントによる)最後に別のパスを追加して、更新されたパスを反映するようにファイルを更新BASE_DIRします。例えば:base.py.parent

    base.py:

    BASE_DIR = Path(__file__).resolve().parent.parent.parent
    
于 2019-01-21T15:21:02.613 に答える
11

複数のsettings*.pyファイルを作成し、環境ごとに変更する必要がある変数を推定します。次に、マスターsettings.pyファイルの最後に:

try:
  from settings_dev import *
except ImportError:
  pass

settings_*ステージごとに個別のファイルを保持します。

ファイルの先頭に、settings_dev.pyこれを追加します。

import sys
globals().update(vars(sys.modules['settings']))

変更が必要な変数をインポートするには。

このwiki エントリには、設定を分割する方法に関するアイデアがさらにあります。

于 2012-05-19T10:24:31.303 に答える
-2

これは私のソリューションであり、開発、テスト、および本番用に異なる環境があります

import socket

[...]

DEV_PC = 'PC059'
host_name = socket.gethostname()

if host_name == DEV_PC:
   #do something
   pass
elif [...]
于 2016-10-03T09:21:44.860 に答える