2012-09-09 16 views
11

settings.pyとデータベース以外の設定を保存して保存する場所を探しているときに、環境変数にenvironment.jsonを使用しました。私はsettings.pyでこれらをインポートします。Djangoの設定に環境変数を使用できません

私の環境で新しい値を変更または保存しようとすると、envsettings.pyは変更に気付かれません。おそらく、settings.pyがDjangoによって読み込まれた時間と回数です。

以下のような方法で私の環境変数を使用する方法はありますか?

# 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' 

そうでない場合、どのように他の私は、私のDjangoプロジェクトでsettings.pyどこかで検索された変更の設定を保存することができますか?

答えて

7

私は質問が若干変更を参照してくださいオリジナルの答えは以下の残っているが、これはわずかに異なる答えがあります。


まず、あなたは右のsettings.pyを使用していることを確認してください(print 'This file is being loaded'を行う必要がありますトリック)。

第2に、個人的には、Pythonファイルよりもダイナミックではないので、個人的に私はconfig用のjsonファイルを使用することを勧めますが、関係なく動作するはずです。

私はこのような何かを行う方法をお勧めします:

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

これらの設定ファイルからDjangoモジュールをインポートする際には、非常に注意が必要です。いずれかのモジュールがfrom django.conf import settingsを実行した場合、そのポイント以降の設定の解析は中止されます。 JSONファイルを使用するよう

、当然の大体同じ原理:もう一度

  • 、必ず輸入ここdjango.conf.settings
  • があなたの内のすべての変数を作る何も持っていないことを確認してくださいお使いの設定ファイルにグローバルJSONファイル:Fなどのオープンと

    輸入JSON ( '/ホーム/ dotcloud/environment.json'): ENV = json.load(F) #少しハックへenvグローバル内のすべての変数を globals()にします。更新(ENV)


かかわらず、しかし、私はこの周りを回して、代わりに設定ファイルのインポートにこのモジュールをさせるお勧めします。

また、Djangoはデフォルトで環境変数に耳を傾けていません(DJANGO_SETTINGS_MODULE以外のでそれも問題がある可能性があります。

+0

シェルで 'putenv()'を使用しても、環境値は変更されません。 'putenv()'がサポートされている場合、 'os.environ'の項目への代入は' putenv() 'の対応する呼び出しに自動的に変換されます。しかし、 'putenv()'を呼び出すと 'os.environ'は更新されないので、実際にはos.environ'の項目に割り当てる方が望ましいです。"私は動的に設定を保存して変更する別の方法を見つけなければならないかもしれないと思います電子メール用。 – Kiwi

+1

おっと...そうです、私はその部分を削除します。残りのアドバイスはまだ残っています:) – Wolph

+0

ちょっと、少なくとも私はPythonで環境変数操作に関するいくつかの新しいことを学びました。 ;) – Kiwi

33

あなたはforemanGitHub)またはhonchoGitHub)に見たいと思うかもしれません。どちらのこれらは、ローカル環境変数をロードする、そこから現在のディレクトリにある.envファイルを探し

マイ .envは、ほとんどのプロジェクト(私はデータベース構成用のDJ-データベースURLを使用)のために次のようになります。

あなたの settings.pyファイルで
DATABASE_URL=sqlite://localhost/local.db 
SECRET_KEY=<a secret key> 
DEBUG=True 

、あなたはこのようなos.environからこれらの設定を読み込むことができます。必要な設定がある場合は、あなたがそれらを設定しようとする前にその存在をassertでき

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

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

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

関連する問題