Django
設定
サーチ…
タイムゾーンの設定
Djangoがsettings.py
ファイルで使用するタイムゾーンを設定することができます。例:
TIME_ZONE = 'UTC' # use this, whenever possible
TIME_ZONE = 'Europe/Berlin'
TIME_ZONE = 'Etc/GMT+1'
Windows環境で実行する場合は、 システムのタイムゾーンと同じに設定する必要があります。
Djangoにタイムゾーン対応の日付を使用させたくない場合:
USE_TZ = False
Djangoのベストプラクティスでは、 UTC
を使用してデータベースに情報を格納する必要があります。
Webサイトが1つのタイムゾーンでのみ利用可能な場合でも、データをUTCにデータベースに保存することをお勧めします。主な理由は夏時間(DST)です。多くの国では、DSTのシステムがあり、時計は春と秋に前進します。現地時間で作業している場合は、移行が発生した年に2回、エラーが発生する可能性があります。
https://docs.djangoproject.com/en/stable/topics/i18n/timezones/
設定へのアクセス
すべての設定が完了したら、コード内でその設定を使用することになります。これを行うには、ファイルに次のインポートを追加します。
from django.conf import settings
次に、 settings
モジュールの属性として設定にアクセスできます。たとえば、次のようになりsettings
。
if not settings.DEBUG:
email_user(user, message)
アプリの移植性を保証するためにBASE_DIRを使用する
アプリケーションのパスをハードコードするのは悪い考えです。コードが異なるマシン間でシームレスに動作できるように、常に相対URLを使用する必要があります。これを設定する最も良い方法は、このような変数を定義することです
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
次に、このBASE_DIR
変数を使用して、他のすべての設定を定義します。
TEMPLATE_PATH = os.path.join(BASE_DIR, "templates")
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
等々。これにより、心配することなく異なるマシン間でコードを移植できるようになります。
しかし、 os.path
は少し冗長です。たとえば、設定モジュールがproject.settings.dev
場合、次のように記述する必要があります。
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
別の方法として、 unipath
モジュール( pip install unipath
できます)を使用する方法があります。
from unipath import Path
BASE_DIR = Path(__file__).ancestor(2) # or ancestor(3) if using a submodule
TEMPLATE_PATH = BASE_DIR.child('templates')
STATICFILES_DIRS = [
BASE_DIR.child('static'),
]
環境変数を使用してサーバー間で設定を管理する
環境変数を使用することは、 The Twelve-Factor Appに記載されているように、環境に応じてアプリの設定を設定するために広く使用されています。
デプロイメント環境間で設定が変更される可能性があるため、アプリケーションのソースコードを掘り下げたり、アプリケーションファイルやソースコードリポジトリの外に秘密を置かずに設定を変更するのは非常に興味深い方法です。
Djangoでは、メイン設定はプロジェクトのフォルダのsettings.py
にあります。シンプルなPythonファイルなので、標準ライブラリのPythonのos
モジュールを使用して環境にアクセスすることができます(そして適切なデフォルトを持つことさえできます)。
settings.py
import os
SECRET_KEY = os.environ.get('APP_SECRET_KEY', 'unsafe-secret-key')
DEBUG = bool(os.environ.get('DJANGO_DEBUG', True) == 'False')
ALLOWED_HOSTS = os.environ.get('DJANGO_ALLOWED_HOSTS', '').split()
DATABASES = {
'default': {
'ENGINE': os.environ.get('APP_DB_ENGINE', 'django.db.backends.sqlite3'),
'NAME': os.environ.get('DB_NAME', 'db.sqlite'),
'USER': os.environ.get('DB_USER', ''),
'PASSWORD': os.environ.get('DB_PASSWORD', ''),
'HOST': os.environ.get('DB_HOST', None),
'PORT': os.environ.get('DB_PORT', None),
'CONN_MAX_AGE': 600,
}
}
Djangoではデータベース技術を変更することができるので、sqlite3を開発マシン上で使うことができます(そして、ソース管理システムにコミットするためにはsediteがデフォルトです)。これは可能ですがお勧めできません:
アプリのデータベース、キューイングシステム、キャッシュなどのバッキングサービスは、dev / prodパリティが重要な領域の1つです。 ( 12因子のアプリケーション - 開発/プロダクトパリティ )
データベース接続にDATABASE_URLパラメータを使用する場合は、 関連する例を参照してください。
複数の設定を使用する
Djangoのデフォルトのプロジェクトレイアウトは、一つのsettings.py
作成しsettings.py
。これは、以下のように分割すると便利です。
myprojectroot/
myproject/
__init__.py
settings/
__init__.py
base.py
dev.py
prod.py
tests.py
これにより、開発中、生産中、テスト中など、さまざまな設定で作業することができます。
デフォルトのレイアウトからこのレイアウトに移動するとき、元のsettings.py
はsettings/base.py
なりsettings/base.py
。他のすべてのサブモジュールがfrom .base import *
始まるsettings/base.py
を "サブクラス化"するとき。たとえば、 settings/dev.py
は次のようになりsettings/dev.py
。
# -*- coding: utf-8 -*-
from .base import * # noqa
DEBUG = True
INSTALLED_APPS.extend([
'debug_toolbar',
])
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
INTERNAL_IPS = ['192.168.0.51', '192.168.0.69']
代替案#1
django-admin
コマンドが正しく動作するためには、 DJANGO_SETTINGS_MODULE
環境変数(デフォルトはmyproject.settings
)を設定する必要がありmyproject.settings
。開発中は、 myproject.settings.dev
設定しmyproject.settings.dev
。プロダクションでは、 myproject.settings.prod
設定しmyproject.settings.prod
。 virtualenvを使用する場合は、 postactivate
スクリプトで設定するのが最善です。
#!/bin/sh
export PYTHONPATH="/home/me/django_projects/myproject:$VIRTUAL_ENV/lib/python3.4"
export DJANGO_SETTINGS_MODULE="myproject.settings.dev"
DJANGO_SETTINGS_MODULE
によって指されていない設定モジュールを一度に使い--settings
場合は、 django-admin
--settings
オプションを使うことができます:
django-admin test --settings=myproject.settings.tests
代替案#2
あなたが残しておきたい場合はDJANGO_SETTINGS_MODULE
(デフォルトの設定でmyproject.settings
)、あなたは簡単に伝えることができsettings
あなたにインポートを置くことで、ロードする設定モジュールを__init__.py
ファイル。
上記の例では、 __init__.py
設定することで同じ結果が得られます。
from .dev import *
複数の要件ファイルの使用
各要件ファイルは、設定ファイルの名前と一致する必要があります。詳細は、 複数の設定を使用して読むを参照してください。
構造
djangoproject
├── config
│ ├── __init__.py
│ ├── requirements
│ │ ├── base.txt
│ │ ├── dev.txt
│ │ ├── test.txt
│ │ └── prod.txt
│ └── settings
└── manage.py
base.txt
ファイルでは、すべての環境で使用される依存関係を配置します。
# base.txt
Django==1.8.0
psycopg2==2.6.1
jinja2==2.8
その他のすべてのファイルでは、 -r base.txt
ベース依存関係を-r base.txt
、現在の環境に必要な特定の依存関係を追加します。
# dev.txt
-r base.txt # includes all dependencies in `base.txt`
# specific dependencies only used in dev env
django-queryinspect==0.1.0
# test.txt
-r base.txt # includes all dependencies in `base.txt`
# specific dependencies only used in test env
nose==1.3.7
django-nose==1.4
# prod.txt
-r base.txt # includes all dependencies in `base.txt`
# specific dependencies only used in production env
django-queryinspect==0.1.0
gunicorn==19.3.0
django-storages-redux==1.3
boto==2.38.0
最後に、依存関係をインストールします。 dev envの例: pip install -r config/requirements/dev.txt
JSONファイルを使用して秘密データを隠す
GitやSVNなどのVCSを使用する場合、(リポジトリが公開されているかプライベートであるかにかかわらず)バージョン化されてはならない秘密のデータがあります。
これらのデータの中には、 SECRET_KEY
設定とデータベースパスワードがあります。
これらの設定をバージョン管理から隠す一般的な方法は、プロジェクトのルートにsecrets.json
というファイルを作成することです( このアイデアについては、 " Two Scoops of Django "に感謝します):
{
"SECRET_KEY": "N4HE:AMk:.Ader5354DR453TH8SHTQr",
"DB_PASSWORD": "v3ry53cr3t"
}
それを無視リストに追加します( .gitignore
for git):
*.py[co]
*.sw[po]
*~
/secrets.json
次に、次の機能をsettings
モジュールに追加します。
import json
import os
from django.core.exceptions import ImproperlyConfigured
with open(os.path.join(BASE_DIR, 'secrets.json')) as secrets_file:
secrets = json.load(secrets_file)
def get_secret(setting, secrets=secrets):
"""Get secret setting or fail with ImproperlyConfigured"""
try:
return secrets[setting]
except KeyError:
raise ImproperlyConfigured("Set the {} setting".format(setting))
次に、設定を次のように入力します。
SECRET_KEY = get_secret('SECRET_KEY')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgres',
'NAME': 'db_name',
'USER': 'username',
'PASSWORD': get_secret('DB_PASSWORD'),
},
}
環境からのDATABASE_URLの使用
HerokuなどのPaaSサイトでは、複数のパラメータ(ホスト、ポート、ユーザー、パスワードなど)ではなく、単一のURL環境変数としてデータベース情報を受け取るのが普通です。
モジュールdj_database_url
あり、Djangoにデータベース設定を注入するのに適したPython辞書にDATABASE_URL環境変数を自動的に抽出します。
使用法:
import dj_database_url
if os.environ.get('DATABASE_URL'):
DATABASES['default'] =
dj_database_url.config(default=os.environ['DATABASE_URL'])