基本原理
ジャンゴ1.8約140の項目は、構成設定モジュールによって設定することができます。モジュールの初期設定は、Djangoのサービスを起動するたびに、ので、settings.py変更されたファイルに、Djangoを有効にするには、サーバーを再起動する必要があります。
-
すべての設定ファイルは、バージョン管理、変更日付/時刻情報やコメントバージョン管理などの構成項目である必要があります
-
DRY、によって
import base_settings
継承、回避のコピー&ペースト -
バージョン管理上の機密情報ではありません
複数の設定ファイルを使用します
settings/
__init__.py
base.py
local.py
staging.py
test.py
production.py
各ファイルに対応する設定とファイルの要件
設定ファイル名|目的
----------------------- |
local.py、dev.pyのようなローカルコンテンツの開発環境の設定、| DEBUG=True
オープンジャンゴ-デバッグ-ツールバーなど
staging.py |ステージステージングのためのconfigureコンテンツ
test.pyを |テストの実行のためのconfigureコンテンツ
production.py、prod.pyを |本番環境での設定内容
ci.py |継続的インテグレーションサーバ用の設定内容
どのように使用するには:
- シェル
python manage.py shell --settings=twoscoops.settings.local
- サービス開始
python manage.py runserver --settings=twoscoops.settings.local
- セットDJANGO_SETTINGS_MODULEとPYTHONPATH環境変数。あなたが使用している場合はvirtualenvのを、それぞれの環境のためにアクティブスクリプトに設定することができDJANGO_SETTINGS_MODULEとPYTHONPATH。
開発環境での設定ファイルの例:
# settings/local.py
from .base import *
DEBUG = True
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": "twoscoops",
"USER": "",
"PASSWORD": "",
"HOST": "localhost",
"PORT": "",
}
}
INSTALLED_APPS += ("debug_toolbar", )
上記の例でありfrom .base import *
である、import *
Djangoは唯一の場所である、使用に賛成。私たちは、設定ファイルに名前空間のすべてをカバーしたいので。
開発環境のためにも、複数の設定ファイルを持つことができます
基本的な原理は、各設定ファイルはバージョン管理する必要があるということです。あなたは、次のようなさまざまな開発者のための適切な設定ファイルを作成することができます。
# settings/dev_pydanny.py
from .dev import *
# Set short cache timeout
CACHE_TIMEOUT = 30
そして、全ての設定後に作成されたファイルは次のようになります。
settings/
__init__.py
base.py
dev.py
dev_audreyr.py
dev_pydanny.py
local.py
staging.py
test.py
production.py
コードから構成情報を分離します
SECRET_KEY、APIキーとコードベースに格納された他の情報は、次のような問題があります。
-
各展開必見の変更のための情報
-
SECRET_KEY同等の設定値ではなく、コード
-
ライブラリに保存されているコードは、コードライブラリを見ることができる人々にそこにアクセスしています
-
ほとんどのPaaSは、単一サーバーの構成機能を提供していません。
解決策は、使用することです環境変数を。
保持するために使用し、環境変数SECRET_KEY:などのメリット情報を
-
これらの機密情報が別の場所に保存されているので、各ファイルのバージョン管理に躊躇しないだろう
-
、各展開の構成情報を変更する必要性を排除
-
ほとんどのPaaSプラットフォームは、環境変数を使用することを推奨し、対応する設定と管理ツールを提供しています
地元で環境変数を設定する方法
Linux / Macのではbashはに構成コードによって追加の.bashrc、.bash_profileファイルまたは.profileの他の構成ファイルの背後にあります。使用virtualenvのは、virtualenvののであってもよいのbin /アクティブスクリプト内で設定するには、設定コードを追加します:
構成コード:
$ export SOME_SECRET_KEY=1c3-cr3am-15-yummy
$ export AUDREY_FREEZER_KEY=y34h-r1ght-d0nt-t0uch-my-1c3-cr34m
勝つには、がありCMD.EXEによってSETX virtualenvののであってもよいフィギュレーションコマンドactivate.bat / binに設定スクリプト。
構成コード:
> set SOME_SECRET_KEY 1c3-cr3am-15-yummy
PowerShellのよりCMD.EXEより、強力なVistaで利用可能とバージョン以上。環境変数は、PowerShellを使用するように設定されています。
現在のユーザーのためにのみ:
[Environment]::SetEnvironmentVariable("SOME_SECRET_KEY",
"1c3-cr3am-15-yummy", "User")
[Environment]::SetEnvironmentVariable("AUDREY_FREEZER_KEY",
"y34h-r1ght-d0nt-t0uch-my-1c3-cr34m", "User")
マシンのすべてのユーザーの場合:
[Environment]::SetEnvironmentVariable("SOME_SECRET_KEY",
"1c3-cr3am-15-yummy", "Machine")
[Environment]::SetEnvironmentVariable("AUDREY_FREEZER_KEY",
"y34h-r1ght-d0nt-t0uch-my-1c3-cr34m", "Machine")
本番環境変数の設定例
- Herokuの上に設定
$ heroku config:set SOME_SECRET_KEY=1c3-cr3am-15-yummy
- Pythonでアクセスされた構成情報
>>> import os
>>> os.environ["SOME_SECRET_KEY"]
"1c3-cr3am-15-yummy"
- 設定ファイル内のこれらのアクセス設定
# Top of settings/production.py
import os
SOME_SECRET_KEY = os.environ["SOME_SECRET_KEY"]
SECRET_KEY例外が処理上に提供されていません
あなたがアクセスコード上記SECRET_KEY値がスローされますされない場合はKeyError例外を、プロジェクトが起動できません。しかし、効果的なメッセージを提供していない例外はデバッグを助長されていません。
で設定/ base.py処理のために次のコード:
# settings/base.py
import os
# Normally you should not import ANYTHING from Django directly
# into your settings, but ImproperlyConfigured is an exception.
from django.core.exceptions import ImproperlyConfigured
def get_env_variable(var_name):
"""Get the environment variable or return exception."""
try:
return os.environ[var_name]
except KeyError:
error_msg = "Set the {} environment variable".format(var_name)
raise ImproperlyConfigured(error_msg)
次に、設定ファイルに、使用します。
SOME_SECRET_KEY = get_env_variable("SOME_SECRET_KEY")
その後、無SOME_SECRET_KEYこの環境変数場合、次のエラーメッセージが表示されます。
django.core.exceptions.ImproperlyConfigured: Set the SOME_SECRET_KEY
environment variable.
manage.py
デフォルトのDJANGO_SETTINGS_MODULEのポイントsettings.pyマルチ設定ファイルで使用するために推奨される、django-admin
単一の設定ファイルを使用して、manage.py
これらの2つの基本的なコマンドは等価です。
$ django-admin <command> [options]
$ manage.py <command> [options]
環境変数を設定しない場合
それらの環境変数を使用してApacheなどは、上記システムのための方法を設定するような環境のような変数が有効でない場合、機密情報は、非実行可能ファイルに格納されてもよいし、ファイルバージョン制御は行われません。
-
機密情報を保存するためのファイルを生成し、フォーマットはJSON、Configを、YAMLやXMLすることができます。
-
情報を管理するためのローダーを追加
-
ファイル名は増加している.gitignoreと.hgignore
JSON形式
- secrets.jsonファイルを生成します。
{
"FILENAME": "secrets.json",
"SECRET_KEY": "I've got a secret!",
"DATABASES_HOST": "127.0.0.1",
"PORT": "5432"
}
- ローダーの設定/ base.py、この情報へのアクセスを追加します。
# settings/base.py
import json
# Normally you should not import ANYTHING from Django directly
# into your settings, but ImproperlyConfigured is an exception.
from django.core.exceptions import ImproperlyConfigured
# JSON-based secrets module
with open("secrets.json") as f:
secrets = json.loads(f.read())
def get_secret(setting, secrets=secrets):
"""Get the secret variable or return explicit exception."""
try:
return secrets[setting]
except KeyError:
error_msg = "Set the {0} environment variable".format(setting)
raise ImproperlyConfigured(error_msg)
SECRET_KEY = get_secret("SECRET_KEY")
複数の要件文書を使用します
各ファイルに対応した設定は、要件文書を持っており、異なる構成に対応し、対応するだけの依存関係をインストールする必要があります。
例えば要件文書、:
requirements/
base.txt
local.txt
staging.txt
production.txt
base.txt次のような格納されているグローバルの依存関係、
Django==1.8.0
psycopg2==2.6
djangorestframework==3.1.1
そして、ローカルの開発環境のためにlocal.txt、できるbase.txt依存に基づいて他の追加:
-r base.txt # includes the base.txt requirements file
coverage==3.7.1
django-debug-toolbar==1.3.0
継続的インテグレーションサーバ用ci.txtをすることができます:
-r base.txt # includes the base.txt requirements file
coverage==3.7.1
django-jenkins==0.16.4
production.txt基本的な意志とbase.txt同じことが次のようになります。
-r base.txt # includes the base.txt requirements file
インストール
地元の発展のために:
$ pip install -r requirements/local.txt
本番環境の場合:
$ pip install -r requirements/production.txt
すべての要件ファイルの依存関係を特定のバージョンに割り当てられている、これはプロジェクトがより安定であることが保証されます。
ファイルパスの設定ファイルを処理します
いないハードコードにファイルパスを実行します。
- 使用Unipathファイル処理のためのパス
# At the top of settings/base.py
from unipath import Path
BASE_DIR = Path(__file__).ancestor(3)
MEDIA_ROOT = BASE_DIR.child("media")
STATIC_ROOT = BASE_DIR.child("static")
STATICFILES_DIRS = (
BASE_DIR.child("assets"),
)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
DIRS = (BASE_DIR.child("templates"),)
},
]
- 使用はos.pathファイル処理経路のために
# At the top of settings/base.py
from os.path import join, abspath, dirname
here = lambda *dirs: join(abspath(dirname(__file__)), *dirs)
BASE_DIR = here("..", "..")
root = lambda *dirs: join(abspath(BASE_DIR), *dirs)
# Configuring MEDIA_ROOT
MEDIA_ROOT = root("media")
# Configuring STATIC_ROOT
STATIC_ROOT = root("collected_static")
# Additional locations of static files
STATICFILES_DIRS = (
root("assets"),
)
# Configuring TEMPLATE_DIRS
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
DIRS = (root("templates"),)
},
]
Djangoの使用、設定ファイルとDjangoのデフォルト設定の差を検索するにはdiffsettings
、コマンドを。