13

settings.py とデータベースを超えて設定を保存および保存する場所を見つけようとして、環境変数に environment.json を使用しました。これらを settings.py にインポートします。

私の問題は、自分の環境で新しい値を変更または保存しようとしても、おそらく settings.py が Django によって読み取られる時間と回数が原因で、変更envsettings.py気付かないことです。

以下で試したように、環境変数を好きなように使用できる方法はありますか?

# settings.py
import json
with open('/home/dotcloud/environment.json') as f:
    env = json.load(f)
EMAIL_HOST = env.get('EMAIL_PORT', '500')

# views.py
import json
def site_configuration(request):
    with open('/home/dotcloud/environment.json') as f:
        env = json.load(f)
    if request.method == 'POST':
        os.environ['EMAIL_PORT'] = request.POST['email_port']
    return render(request, ...)

# python manage.py shell demo
>>> import json
>>> with open('/home/dotcloud/environment.json') as f:
...     env = json.load(f)
... 
>>> project_settings.EMAIL_PORT
'500'
>>> env['EMAIL_PORT']
Traceback (most recent call last):
  File "<console>", line 1, in <module>
KeyError: 'EMAIL_PORT'
>>> env['EMAIL_PORT'] = "123"
>>> env['EMAIL_PORT']
'123'
>>> project_settings.EMAIL_PORT
'500'
>>> project_settings.EMAIL_PORT == env['EMAIL_PORT']
False'

settings.pyそうでない場合、Django プロジェクトのどこかで取得された変更可能な設定を他にどのように保存できますか?

4

2 に答える 2

37

foreman( GitHub ) またはhoncho( GitHub )を調べてください。.envこれらは両方とも、ローカル環境変数をロードする現在のディレクトリ内のファイルを探します。

.envはほとんどのプロジェクトで次のように見えます (データベース構成には dj-database-url を使用します):

DATABASE_URL=sqlite://localhost/local.db
SECRET_KEY=<a secret key>
DEBUG=True

ファイルでは、次のようにsettings.pyこれらの設定をロードできます。os.environ

import os
DEBUG = os.environ.get('DEBUG', False)

必要な設定がある場合は、設定をassert試みる前に存在することができます。

assert 'SECRET_KEY' in os.environ, 'Set SECRET_KEY in your .env file!'
SECRET_KEY = os.environ['SECRET_KEY']

私が開始した最近のいくつかのプロジェクトでは、ローカル設定を処理するこの方法を使用してきましたが、非常にうまく機能していると思います。1 つの注意点は、ソース管理に決してコミットしないことです。.envこれらは、現在の構成用にのみ存在するローカル設定であり、別の環境用に再作成する必要があります。

于 2012-09-17T17:57:11.410 に答える
7

質問がわずかに変更されていることがわかります。元の回答はまだ下にありますが、これには少し異なる回答があります。


まず、正しい settings.py を使用していることを確認してください (print 'This file is being loaded'うまくいくはずです)。

第二に、個人的には、Python ファイルよりも動的ではないため、設定に json ファイルを使用しないことをお勧めしますが、それでも動作するはずです。

このようなことをする私の推奨方法:

  1. base_settings.py標準設定でファイルを作成する
  2. settings.pyデフォルト設定のインポートとなる を作成します。from base_settings import *基本設定を継承するには、このファイルの先頭に が必要です。
  3. たとえば、カスタム設定ファイルが必要な場合は、 (または) をdotcloud_settings.py追加し、セットアップに応じて環境変数をまたはに設定します。from dotcloud_settings import settingsbase_settingsDJANGO_SETTINGS_MODULEdotcloud_settingsyour_project.dotcloud_settings

これらの設定ファイルから Django モジュールをインポートする際には、細心の注意を払う必要があることに注意してください。いずれかのモジュールが afrom django.conf import settingsを実行すると、その時点以降、設定の解析が停止します。

jsonファイルの使用に関しては、もちろんほぼ同じ原則です:

  • django.conf.settingsもう一度、ここにインポートするものがないことを確認してください
  • json ファイル内のすべての変数を設定ファイルに対してグローバルにします。

    import json with open('/home/dotcloud/environment.json') as f: env = json.load(f) # env 内のすべての変数をグローバル globals().update(env) にするちょっとしたハック


とにかく、これを好転させ、代わりに設定ファイルにこのモジュールをインポートさせることをお勧めします。

また、Django はデフォルトで環境変数をリッスンしません (その上、DJANGO_SETTINGS_MODULEそれも問題になる可能性があります。

于 2012-09-09T00:43:06.277 に答える