Djangoの設定のベタープラクティス
Djangoをデプロイする時の設定です。ベストプラクティスじゃなくて(そのままよりは)ベタープラクティスです
絶対に漏れ、抜けがあるので参考程度に見てください。公式を見るのが最も安全です。
settings.pyの分割
Djangoの本番/開発設定を切り分けるにはsettings.pyを開発用、本番用に分割するのが良いようです。実際DjangoのCMSである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がよしなにやってくれますが、動作を知りたい人は以前の記事で書いたので読んでみてください。
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:それがセキュリティ的に正しいのかはわかりませんが...