37

Django のドキュメントには、独自の設定を に追加できることが記載django.conf.settingsされています。したがって、私のプロジェクトのsettings.py定義が

APPLES = 1

settings.APPLESそのプロジェクトのアプリでアクセスできます。

しかし、mysettings.pyがその値を定義していない場合、アクセスsettings.APPLESは明らかに機能しません。APPLESに明示的な設定がない場合に使用されるデフォルト値を定義する方法はありますsettings.pyか?

設定が必要なモジュール/パッケージでデフォルト値を定義することをお勧めします。

4

5 に答える 5

33

私のアプリには、別の settings.py ファイルがあります。そのファイルには、プロジェクトの settings.py ファイルを検索する get() 関数があり、見つからない場合はデフォルト値を返します。

from django.conf import settings

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


APPLES = get('APPLES', 1)

次に、私が持っているAPPLESにアクセスする必要がある場所:

from myapp import settings as myapp_settings

myapp_settings.APPLES

これにより、プロジェクトの settings.py でオーバーライドが可能になります。getattr は最初にそこをチェックし、属性が見つかった場合は値を返すか、アプリの設定ファイルで定義されたデフォルトを使用します。

于 2011-04-08T23:02:45.963 に答える
19

ちょうどどうですか:

getattr(app_settings, 'SOME_SETTING', 'default value')
于 2015-04-07T18:37:42.787 に答える
8

ここに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 で同じ変数を宣言している場合、どのアプリケーションが要求したデフォルト値を返すかはわかりません。

于 2015-08-25T22:00:13.370 に答える
2

マイクの答えから始めて、デフォルト設定の処理を使いやすいインターフェイスを持つクラスにラップしました。

ヘルパー モジュール:

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オブジェクトを使用して、すべての標準設定値にアクセスすることもできます。

于 2011-04-09T00:20:20.730 に答える
0

私は最近同じ問題を抱えており、まさにそのような場合に使用するように設計された Django アプリを作成しました。特定の設定のデフォルト値を定義できます。次に、設定がグローバル設定ファイルに設定されているかどうかを最初に確認します。そうでない場合は、デフォルト値が返されます。

いくつかの型チェックやデフォルト値の事前処理もできるように拡張しました(たとえば、ドット付きクラスパスはロード時にクラス自体に変換できます)

アプリはhttps://pypi.python.org/pypi?name=django-pluggableappsettings&version=0.2.0&:action=displayにあります。

于 2015-09-29T14:45:49.793 に答える