web-dev-qa-db-ja.com

djangoアプリケーションごとの設定-ベストプラクティス?

これはこの質問に多少関係しています
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

明らかに他にもいくつかの順列がありますが、私の意図は明らかだと思います。
前もって感謝します。

38
w--

最も簡単な解決策は、あなたが自分に言及している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"
9

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.pys 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
5
AbdolHosein

ベストプラクティスについてはわかりませんが、次のスタイルで問題はありません。

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
2
Viktor Danyliuk