2012-09-09 3 views
11

settings.py 및 데이터베이스 설정을 저장하고 저장할 장소를 찾으려고 할 때 환경 변수에 environment.json을 사용했습니다. 나는 이것을 settings.py에서 가져온다.Django 설정에 환경 변수를 사용할 수 없습니다

내 환경에서 새로운 값을 변경하거나 저장할 때 env, settings.py은 변경 사항을 알지 못합니다. 아마도 settings.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 검색합니다 변경 설정을 저장할 수 ?

답변

7

내가 질문을 약간 변경, 원래의 답변을 아래에 여전히 볼 수 있지만이 하나가 약간 다른 대답이 있습니다


첫째, 당신이 바로 settings.py를 사용하고 있는지 확인을 (print 'This file is being loaded'은 어떻게해야 장난).

둘째, 개인적으로 Python 파일보다 동적이지 않기 때문에 개인적으로 json 파일 사용을 권장하지 않지만 관계없이 작동해야합니다. 이런 식으로 일을의

내 권장되는 방법 :

  1. 가 기본 설정 될 것입니다 settings.py 가져 만들 표준 설정
  2. base_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 변수 환경을 설정합니다.

이 설정 파일에서 장고 모듈을 가져 오는 데 매우주의해야합니다. 어떤 모듈이 from django.conf import settings을 실행하면 그 시점 이후에 설정을 파싱하는 것을 멈 춥니 다. JSON 파일, 물론 거의 같은 원리 사용에 관해서는

: 다시 한번

  • 을, 당신이 여기 django.conf.settings
  • 이 모든 변수를 내에 확인 가져 아무것도하지 않는 수 있도록하여

    수입 JSON 공개와 ('/ 홈/dotcloud/environment.json') F와 같은 : 설정 파일에 글로벌 JSON 파일 ENV = json.load (F) # 약간의 해킹에 env 전역의 모든 변수를 globals()로 만듭니다.


에 관계없이, 나는 주변이 회전하고 대신 설정 파일 가져 오기이 모듈을시키는 권하고 싶습니다하지만 갱신 (ENV). DJANGO_SETTINGS_MODULE 그래서 그 역시 문제가 될 수 외에

또한, 장고 (기본적으로 환경 변수 말을 듣지 않습니다.

+0

셸에서'putenv()'를 사용하면 환경 값을 변경하지 않습니다. 또한'putenv()'가 지원되면,'os.environ'에있는 항목에 대한 할당이 자동으로'putenv()'에 대응하는 호출로 변환됩니다; 그러나'putenv()'에 대한 호출은'os.environ'을 갱신하지 않으므로 실제로 os.environ'의 항목에 할당하는 것이 바람직합니다. "나는 동적으로 설정을 저장하고 변경하는 또 다른 방법을 찾아야 할 수도 있습니다 전자 메일 용. – Kiwi

+1

죄송합니다 ... 당신 말이 맞아요, 나는 그 부분을 제거 할 것입니다. 나머지 조언은 여전히 ​​중요합니다 :) – Wolph

+0

이봐, 적어도 파이썬에서 환경 변수 조작에 관한 새로운 것들을 배웠다. ;) – Kiwi

33

당신은 foreman (GitHub) 또는 honcho (GitHub로 볼 수도 있습니다). 모두를 이 지역의 환경 변수를로드 할 수있는 현재의 디렉토리에 .env 파일을 찾습니다

.env는 대부분의 프로젝트 (I 데이터베이스 구성 DJ-데이터베이스 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'] 

저는 시작한 마지막 몇 개의 프로젝트에 로컬 설정을 처리하는 방법을 사용 해왔고 실제로 잘 작동한다고 생각합니다. 한 가지주의 할 점은 이 아닙니다..env을 소스 제어에 위탁하십시오. 이는 현재 구성에서만 존재하며 다른 환경에서 다시 작성해야하는 로컬 설정입니다.

관련 문제