2011-04-08 3 views
21

django.conf.settings에 사용자 고유의 설정을 추가 할 수있는 Django 설명서 mentions을 사용할 수 있습니다. 내 프로젝트의 settings.py사용자 정의 Django 설정의 기본값을 정의하는 방법

APPLES = 1 

을 정의하는 경우 그 프로젝트에 내 애플 리케이션에 settings.APPLES와 그 액세스 할 수 있습니다.

그러나 내 settings.py이 값을 정의하지 않으면 settings.APPLES에 액세스하는 것은 분명히 작동하지 않습니다. settings.py에 명시적인 설정이없는 경우 사용되는 APPLES의 기본값을 정의하는 방법이 있습니까?

설정이 필요한 모듈/패키지의 기본값을 정의하는 것이 가장 좋습니다.

답변

24

내 앱에는 별도의 settings.py 파일이 있습니다. 해당 파일에서 프로젝트 settings.py 파일을 조회 할 수있는 get() 함수가 있고 찾지 못하면 기본값을 반환합니다. 내가 사과 액세스해야하는 경우

from django.conf import settings 

def get(key, default): 
    return getattr(settings, key, default) 


APPLES = get('APPLES', 1) 

그럼 내가 가진 : 속성이 발견되었을 경우, 또는

from myapp import settings as myapp_settings 

myapp_settings.APPLES 

이이 프로젝트에 재정의, getattr이 먼저 확인하고 값을 반환합니다 settings.py를 할 수 있습니다 앱 설정 파일에 정의 된 기본값을 사용하십시오.

+0

이것은 약하지 않습니까? 'app_settings.py' 전에 import되는 프로젝트'settings.py'에 의존하지 않습니까? – Flimm

1

Mike의 대답부터 시작하여, 기본 설정 처리를 사용하기 쉬운 인터페이스로 클래스에 래핑했습니다.

도우미 모듈 :

from django.conf import settings 

class SettingsView(object): 
    class Defaults(object): 
     pass 

    def __init__(self): 
     self.defaults = SettingsView.Defaults() 

    def __getattr__(self, name): 
     return getattr(settings, name, getattr(self.defaults, name)) 

사용법 :

django.conf.settings의 값, 또는 그것이이 설정되지 않은 경우 기본을 인쇄
from localconf import SettingsView 

settings = SettingsView() 
settings.defaults.APPLES = 1 

print settings.APPLES 

. 이 settings 개체를 사용하여 모든 표준 설정 값에 액세스 할 수도 있습니다.

+0

앱 별 설정은 명시 적으로 이름을 지정하고 기본 설정과 다르게 읽기 쉬워야한다고 생각합니다. –

1

설정이 정의되어 있는지 확인하고, 설정이 정의되어 있지 않은 경우 기본값으로 지정하십시오. 이 같은

from django.conf import settings 

def setting_default(name, default_value): 
    value = getattr(settings, name, default_value) 
    setattr(settings, name, value) 

을 그리고 (아마도 models.py에서) 설정을 필요로하는 응용 프로그램에서 사용 : 예를 들어, 당신은이 같은 도우미 함수 setting_default를 정의 할 수 있습니다 사용하고 누구든지

setting_default('APPLES', 1) 

이 방법을 당신의 응용 프로그램은 특별한 일을 할 필요가 없습니다.

10

은 어떻게 단지에 대해 : 여기

getattr(app_settings, 'SOME_SETTING', 'default value') 
+0

이것은 여기에있는 다른 제안보다 훨씬 간단하지만 설정/변수를 두 번 이상 사용하려는 경우 DRY 개념을 위반하는 경우 다른 솔루션이 작동 할 수 있습니다. 생각을위한 음식 :) – daniel

+0

DRY는 어떻게 깨지나요? – Charlie

+0

응용 프로그램에서 SOME_SETTING을 두 번 이상 사용하려는 경우에는 어디서나이 getattr (app_settings, 'SOME_SETTING', default_value)'을 배치해야합니다. – daniel

5

두 솔루션입니다. 둘 다 응용 프로그램에서 settings.py 파일을 설정하고 기본값으로 채울 수 있습니다. 코드에서 하나의 응용 프로그램

사용 from MYAPP import settings 대신 from django.conf import settings에 대한

구성의 기본 값입니다.

편집 YOURAPP/__init__.py : 코드에서 전체 프로젝트

사용 from MYPROJECT import settings 대신 from django.conf import settings에 대한

from django.conf import settings as user_settings 
from . import settings as default_settings 

class AppSettings: 
    def __getattr__(self, name): 
     # If the setting you want is filled by the user, let's use it. 
     if hasattr(user_settings, name): 
      return getattr(user_settings, name) 

     # If the setting you want has a default value, let's use it. 
     if hasattr(default_settings, name): 
      return getattr(default_settings, name) 

     raise AttributeError("'Settings' object has no attribute '%s'" % name) 

settings = AppSettings() 

구성 기본값.

이 솔루션을 설치하는 것이 더 쉬워 보일 수 있지만,이 좋은 기본 값이 반환되는 것은 아닙니다 MYPROJECT/MYPROJECT/__init__.py

import os, sys, importlib 
from . import settings as user_settings 

def get_local_apps(): 
    """Returns the locally installed apps names""" 
    apps = [] 
    for app in user_settings.INSTALLED_APPS: 
     path = os.path.join(user_settings.BASE_DIR, app) 
     if os.path.exists(path) and app != __name__: 
      apps.append(sys.modules[app]) 
    return apps 

class AppSettings: 
    SETTINGS_MODULE = 'settings' 

    def __getattr__(self, setting_name): 

     # If the setting you want is filled by the user, let's use it. 
     if hasattr(user_settings, setting_name): 
      return getattr(user_settings, setting_name) 

     # Let's check every local app loaded by django. 
     for app in get_local_apps(): 
      module_source = os.path.join(app.__path__[0], "%s.py" % self.SETTINGS_MODULE) 
      module_binary = os.path.join(app.__path__[0], "%s.pyc" % self.SETTINGS_MODULE) 
      if os.path.exists(module_source) or os.path.exists(module_binary): 
       module = importlib.import_module("%s.%s" % (app.__name__, self.SETTINGS_MODULE)) 

       # Let's take the first default value for this setting we can find in any app 
       if hasattr(module, setting_name): 
        return getattr(module, setting_name) 

     raise AttributeError("'Settings' object has no attribute '%s'" % setting_name) 

settings = AppSettings() 

편집. 여러 응용 프로그램이 해당 settings.py에서 동일한 변수를 선언하면 사용자가 요청한 기본값을 반환 할 응용 프로그램이 무엇인지 알 수 없습니다.

0

나는 최근에 똑같은 문제를 겪었고 정확히 그런 경우에 사용되도록 고안된 장고 앱을 만들었습니다. 특정 설정에 대한 기본값을 정의 할 수 있습니다. 그런 다음 먼저 전역 설정 파일에서 설정이 설정되어 있는지 확인합니다. 그렇지 않으면 기본값을 반환합니다.

나는 또한 어떤 유형 검사하거나 기본값을 사전 처리를 허용하도록 확장 한 응용은에서 찾을 수 있습니다

(예를 들어 점선 클래스 패스는 부하의 클래스 자체로 변환 할 수 있습니다) https://pypi.python.org/pypi?name=django-pluggableappsettings&version=0.2.0&:action=display

관련 문제