THUMBS SHIFT→

このブログは主に親指シフトを用いて書かれています

Djangoの設定のベタープラクティス

Djangoをデプロイする時の設定です。ベストプラクティスじゃなくて(そのままよりは)ベタープラクティスです

絶対に漏れ、抜けがあるので参考程度に見てください。公式を見るのが最も安全です。

settings.pyの分割

Djangoの本番/開発設定を切り分けるにはsettings.pyを開発用、本番用に分割するのが良いようです。実際DjangoCMSであるWagtailもそのような構成になっています。

普通にDjangoでプロジェクトを作ると、

$ django-admin startproject myprj
$ tree myprj

myprj/
├── manage.py
└── myprj
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

となりますが、Wagtailでは

$ wagtail start myprj
$ tree myprj
myprj/
├── manage.py
├── myprj/
│   ├── __init__.py
│   ├── settings/
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── dev.py
│   │   └── production.py
│   ├── urls.py
│   └── wsgi.py

というように、共通の設定(base.py)を用意して、開発用(dev.py)と本番用(production.py)で設定を切り替えています。

そもそもなんで開発/本番で設定を切り替えたいかというと、

  • 本番ではDEBUG=Falseにする
  • SECRET_KEYを隠したい
  • ALLOWED_HOSTSを設定する

など、開発/本番で違う点があるためです。

settingsの中身

具体的に、dev.pyは以下のようになっています。

from .base import *

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'o4ei=g0^4cu88sw$@rwuy*gh!4lu7ex74#0t!h^0=fy2k$4-(2'

# SECURITY WARNING: define the correct hosts in production!
ALLOWED_HOSTS = ['*'] 

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'


# ここはよくわかんない。ローカル専用の設定かな?
try:
    from .local import *
except ImportError:
    pass

前述したとおり DEBUG=Trueなのと、ALLOWED_HOSTS=['*']です。 それにSECRET_KEYが直書きですね。

コメントにSECURITY_WARNINGとあるように、この設定は本番で使ってはいけません。また、SECRET_KEYを公にしてもいけません。もしGithubなどに公開してしまったら、別の値に変えた上で、dev.pyをリポジトリから消しましょう*1

ちなみにdev.pyのファイル名についてですが、ここにあるように、local_settings.pyとするのが一般的なようです。

つぎにproduction.pyです

from .base import *

DEBUG = False

try:
    from .local import *
except ImportError:
    pass

これだけ。もはや何もかいてないです。ちゃんと自分で設定しろということでしょう。

  • DEBUG=False
  • SECRET_KEY
  • DATABASE
  • ALLOWED_HOSTS
  • STATIC_ROOT
  • STATIC_URL

とかを設定すれば動くはずです。多分。

なお、Herokuにデプロイする時はdjango-herokuがよしなにやってくれますが、動作を知りたい人は以前の記事で書いたので読んでみてください。

arark.hatenadiary.jp

settingsを使うには

多分分割しただけだとpython manage.py <command>したときにファイルが見つかんないよ的なエラーが出るとおもいます。

manage.pyを以下のように変えてください。

# もともとこうなっているはずなので
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myprj.settings')

# このように設定ファイルの相対パスを指定する
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myprj.settings.dev")

dev/productionはやはり開発/本番で変えるはずなので、try-catchで、dev.pyがあればそっちを使うなどのように条件分岐させてみてください。

ちなみにwsgi.pyやasgi.pyなども同じように設定する必要があります。

*1:それがセキュリティ的に正しいのかはわかりませんが...