Djangoドキュメント メンションDjango.conf.settings
に独自の設定を追加できます。したがって、私のプロジェクトのsettings.py
が定義している場合
APPLES = 1
そのプロジェクトのアプリでsettings.APPLES
を使用してアクセスできます。
しかし、私のsettings.py
がその値を定義していない場合、settings.APPLES
へのアクセスは明らかに機能しません。 settings.py
に明示的な設定がない場合に使用される、APPLES
のデフォルト値を定義する方法はありますか?
設定が必要なモジュール/パッケージにデフォルト値を定義するのが最善です。
私のアプリには、別のsettings.pyファイルがあります。そのファイルには、プロジェクトのsettings.pyファイルを検索するget()関数があり、見つからない場合はデフォルト値を返します。
from Django.conf import settings
def get(key, default):
return getattr(settings, key, default)
APPLES = get('APPLES', 1)
次に、私が持っているAPPLEにアクセスする必要がある場所:
from myapp import settings as myapp_settings
myapp_settings.APPLES
これにより、プロジェクトのsettings.pyをオーバーライドできます。getattrは最初にそこでチェックし、属性が見つかった場合は値を返すか、アプリ設定ファイルで定義されているデフォルトを使用します。
どうですか:
getattr(app_settings, 'SOME_SETTING', 'default value')
ここに2つの解決策があります。どちらの場合も、アプリケーションにsettings.py
ファイルを設定し、それらにデフォルト値を入力できます。
コードでは、from MYAPP import settings
の代わりにfrom Django.conf import settings
を使用してください。
編集YOURAPP/__init__.py
:
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()
コードでは、from MYPROJECT import settings
の代わりにfrom Django.conf import settings
を使用してください。
編集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で同じ変数を宣言している場合、どのアプリケーションが要求したデフォルト値を返すかを確認できません。
マイクの答えから始めて、デフォルト設定の処理を使いやすいインターフェイスを持つクラスにラップしました。
ヘルパーモジュール:
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))
使用法:
from localconf import SettingsView
settings = SettingsView()
settings.defaults.APPLES = 1
print settings.APPLES
これにより、Django.conf.settings
からの値、または設定されていない場合はデフォルトが出力されます。このsettings
オブジェクトを使用して、すべての標準設定値にアクセスすることもできます。
最近同じ問題が発生し、まさにそのような場合に使用するように設計されたDjangoアプリを作成しました。これにより、特定の設定のデフォルト値を定義できます。次に、最初に設定がチェックされます。はグローバル設定ファイルで設定されます。設定されていない場合は、デフォルト値が返されます。
いくつかの型チェックまたはデフォルト値の前処理も可能にするように拡張しました(たとえば、点線のクラスパスはロード時にクラス自体に変換できます)
アプリは次の場所にあります: https://pypi.python.org/pypi?name=Django-pluggableappsettings&version=0.2.0&:action=display