これはこの質問に多少関係しています
Djangoの設定オブジェクトがLazyObjectである理由
私のDjangoプロジェクトにはいくつかのアプリケーションがあります。各アプリケーションは、独自の重要な設定ファイルを持つことができます。
proj/
proj/
settings.py
app/
settings.py
views.py
ここでの一般的なベストプラクティスは何ですか?
app/settings.pyを実行する必要があります
from Django.conf import settings
APP_SETTING= lambda: settings.getattr('APP_SETTING', 'custom_value')
PROJ_SETTING= lambda: settings.PROJ_SETTING
そしてapp/views.pyで
import .settings
X = settings.APP_SETTING
Y = settings.PROJ_SETTING
または、Djangoコーディングスタイルに従ってapp/settings.pyのDjango遅延設定オブジェクトを変更する必要がありますか?
from Django.conf import settings
# not even sure how I would check for a default value that was specified in proj/settings.py
settings.configure(APP_SETTING='custom_value')
そして、各app/views.pyはDjango.conf設定を介してproj/settings.pyを消費するだけですか?
from Django.conf import settings
X = settings.APP_SETTING
Y = settings.PROJ_SETTING
明らかに他にもいくつかの順列がありますが、私の意図は明らかだと思います。
前もって感謝します。
最も簡単な解決策は、あなたが自分に言及しているgetattr(settings, 'MY_SETTING', 'my_default')
トリックを使用することです。ただし、これを複数の場所で行う必要があると、少々面倒になる可能性があります。
追加の推奨事項:MYAPP_MY_SETTING
のようなアプリごとのプレフィックスを使用します。
Djangoアプリがありますが、これはgetattr
を取り除き、プレフィックスを処理します。詳細は http://Django-appconf.readthedocsをご覧ください) .org/en/latest /
通常、次のような内容でアプリごとにconf.py
を作成します。
from Django.conf import settings
from appconf import AppConf
class MyAppConf(AppConf):
SETTING_1 = "one"
SETTING_2 = (
"two",
)
そしてあなたのコードで:
from myapp.conf import settings
def my_view(request):
return settings.MYAPP_SETTINGS_1 # Note the handy prefix
サイトの設定をカスタマイズする必要がある場合は、サイトのsettings.py
の通常のエントリを実行するだけです。
MYAPP_SETTINGS_1 = "four, four I say"
Django 1.7なので、アプリ指向の構成のためのDjangoベースの構造があります!記述的な解決策を見つけることができます ここ
この新しい構造では、従来はapps.py
プロジェクトに埋め込まれているアプリケーションのフォルダー内のファイル、次のようなもの:
proj/
proj/
settings.py
app1/
apps.py
views.py
app2/
apps.py
views.py
app1/apps.py
ファイルには、次のようなものを含めることができます。
from Django.apps import AppConfig
class App1Config(AppConfig):
# typical systemic configurations
name = 'app1'
verbose_name = 'First App'
# your desired configurations
OPTION_A = 'default_value'
APP_NAMESPACE = 'APP'
APP_OPTION_B = 4
app2/apps.py
このような別のもの:
from Django.apps import AppConfig
class App2Config(AppConfig):
# typical systemic configurations
name = 'app2'
verbose_name = 'Second App'
# your desired configurations
OTHER_CONFIGURATION = 'default_value'
OPTION_C = 5
など、他のapps.py
s in you Djangoアプリケーションフォルダ。
含めたアプリケーションをインポートすることが重要ですapps.py
in、次のように:
# proj/settings.py
INSTALLED_APPS = [
'app1.apps.App1Config',
'app2.apps.App2Config',
# ...
]
これで、希望するアプリベースの構成に次のようにアクセスできます。
from Django.apps import apps
apps.get_app_config('app1').OPTION_A
ベストプラクティスについてはわかりませんが、次のスタイルで問題はありません。
proj/settings.py
OPTION_A = 'value'
# or with namespace
APP_NAMESPACE = 'APP'
APP_OPTION_B = 4
app/settings.py
from Django.conf import settings
from Django.utils.functional import SimpleLazyObject
OPTION_A = getattr(settings, 'OPTION_A', 'default_value')
# or with namespace
NAMESPACE = getattr(settings, APP_NAMESPACE, 'APP')
OPTION_B = getattr(settings, '_'.join([NAMESPACE, 'OPTION_B']), 'default_value')
OPTION_C = getattr(settings, '_'.join([NAMESPACE, 'OPTION_C']), None)
if OPTION_C is None:
raise ImproperlyConfigured('...')
# lazy option with long initialization
OPTION_D = SimpleLazyObject(lambda: open('file.txt').read())
app/views.py
from .settings import OPTION_A, OPTION_B
# or
from . import settings as app_settings
app_settings.OPTION_C
app_settings.OPTION_D # initialized on access