サーチ…


タイムゾーンの設定

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.pysettings/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'),
    },
}

クレジット: Djangoの2つのスクープ:Daniel Roy GreenfeldとAudrey RoyGreenfeldによるDjango 1.8のベストプラクティス著作権2015 2スクーププレス(ISBN 978-0981467344)

環境からの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'])


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow