3

Django 用に構築されたパッケージである django-configurations は、モジュール ベースの設定の読み込みをオブジェクト指向パターンで拡張します。

パッケージはDJANGO_SETTINGS_MODULEDJANGO_CONFIGURATION環境変数と環境変数を使用して、設定ファイルを識別し、適切な構成をそれぞれ読み込みます。

構成 (各オブジェクト) を個別のファイルに分割したいのですが、問題が発生しています。

現在;

    settings/settings.py

に変更したいです。

    settings/base.py  
    settings/local.py  
    settings.production.py

誰かがこれを達成したことがありますか、またはおそらくこれを達成するための実用的なソリューションを知っていますか?

4

3 に答える 3

4

DJANGO_CONFIGURATION変数はconfigurations.Configurationサブクラスを参照します。使用パターンに関するドキュメントで説明されているように、アイデアは、複数の設定ファイルを維持するという面倒なオーバーヘッドを、より DRYer な Mixin/Class ワークフロー スキームと交換することです。manage.py両替しに行くのがめんどくさいのはわかってwsgi.pyいますが、それで得られるものはたくさんあります。

# example settings.py
from configurations import Configuration, values

# Build up some mixin classes for related or app-specific settings:
class AppsMixin(object):
    DJANGO_APPS = (
        'django.contrib.auth', 'django.contrib.contenttypes',
        'django.contrib.sessions', 'django.contrib.messages', 
        'django.contrib.staticfiles', 'django.contrib.sites',
        'django.contrib.flatpages', 'django.contrib.sitemaps',
        'django_extensions'
    )
    ADMIN_APPS = ('filebrowser', 'grappelli', 'django.contrib.admin',)
    DEV_APPS = ('django.contrib.admindocs', 'debug_toolbar',)
    DEFAULT_APPS = (
        'tagging', 'imagekit',
        'tinymce', 'ajax_select',
        'crispy_forms', #...
    )

    @property
    def INSTALLED_APPS(self):
        """ Control application ordering dynamically """
        OUT_APPS = self.DJANGO_APPS + self.ADMIN_APPS
        if self.DEBUG:
            OUT_APPS += self.DEV_APPS
        return  OUT_APPS + self.DEFAULT_APPS

class AuthURLMixin(object):
    LOGIN_REDIRECT_URL = 'site-login-success'
    LOGIN_URL = '/auth/login/'
    LOGOUT_URL = '/auth/logout/'

class CrispyFormsMixin(object):
    """ django-crispy-forms specific settings """
    CRISPY_TEMPLATE_PACK = 'bootstrap3'

    @property
    def CRISPY_FAIL_SILENTLY(self):
        return not self.DEBUG

class Base(AppsMixin, AuthURLMixin, CrispyFormsMixin, Configuration):
    """ Your equivalent for settings/base.py """
    pass

class Local(Base):
    """ ~ settings/local.py """
    DEBUG = True
    TEMPLATE_DEBUG = DEBUG
    # Custom setting that lets subclasses or your apps
    # check which subclass is active.
    STAGING = False
    # Enable a setting to be defined in os.environ, with a sensible default
    # Don't forget the 'DJANGO_' prefix (e.g. DJANGO_TIME_ZONE) 
    TIME_ZONE = values.Value('America/New_York')
    HTTPS_ONLY = False
    # Stash the secret key in os.environ as DJANGO_SECRET_KEY
    SECRET_KEY = values.SecretValue()

    @property
    def CSRF_COOKIE_SECURE(self):
        """ chained dynamic setting """
        return self.HTTPS_ONLY

    @property
    def SESSION_COOKIE_SECURE(self):
        """ chained dynamic setting """
        return self.HTTPS_ONLY

class Staging(Local):
    """ This class is used for testing before going production """
    STAGING = True 
    TIME_ZONE = values.Value('America/Phoenix')
    #...

class Prod(Staging):
    """ ~ settings/production.py """
    DEBUG = False
    STAGING = False
    HTTPS_ONLY = True

次に、ラップトップから:

/path/to/project/$ python manage.py shell --configuration=Local
>>>from django.conf import settings
>>>settings.DEBUG, settings.STAGING, settings.TIME_ZONE
(True, False, 'America/New_York')    

リモートサーバーから:

/path/to/remote/project/$ python manage.py shell --configuration=Staging
>>>from django.conf import settings
>>>settings.DEBUG, settings.STAGING, settings.TIME_ZONE
(True, True, 'America/Phoenix')

すべてが完璧になったら、システム全体に進みます。

# /etc/environment
DJANGO_SETTINGS_MODULE=thisproject.settings
DJANGO_CONFIGURATION=Prod

3 つのファイルの問題は、いくつかの追加機能で解決されました。

  • 動的プロパティを使用すると、インスタンス メソッドを使用して、関連する設定を一度にいくつでも切り替えたり補間したりできます。
  • 設定のチャンクは、ミックスインを介して導入および削除できます。
  • 機密性の高いキー設定は、ソース管理から除外されます。

したがって、これらのファイルをそれぞれ 3 つのクラスで 3 つ作成することもできますが、9 つのクラスで 1 つを作成しないのはなぜでしょうか?

于 2015-01-31T22:46:01.797 に答える
0

単一の設定ファイルを使用して、その中に条件を設定してみることができます。したがって、ローカルで実行すると、リモートで実行する場合とは異なるパラメーターが設定されます。例えば:

import os

DEVELOPMENT_MODE = not os.path.isfile('/mnt/SERVER')

DEBUG = DEVELOPMENT_MODE
TEMPLATE_DEBUG = DEBUG

上記は、マシン「/mnt/SERVER」上のファイルをチェックします。私のサーバーにはこのファイルがありますが、ラップトップにはありません。空のファイルで、単なるプレースホルダーです。しかし、それは私がそのように使用できる私の設定にフラグを設定します:

if DEVELOPMENT_MODE:
  CONST_URL = 'http://localhost:8000'
else:
  CONST_URL = 'http://www.website.com'

私はこれを何年も使用してきましたが、利点は、Apache、wsgi、および manage.py が変更されていないことです。

于 2014-07-03T04:08:46.567 に答える