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 つを作成しないのはなぜでしょうか?