Django に限った話ではないですが、開発環境と本番環境の設定ファイルの切り替え方法って悩みますよね。
ベストプラクティスかはわかりませんが、私が実施している Django の環境毎の切り替え方法を晒したいと思います。
Contents
バージョン
- CentOS 7
- Python 3.6.4
- pip 9.0.1
- Django 2.0.3
- Apache 2.4.6
- mod_wsgi 4.6.3
前提
開発は runserver で動かして、本番は Apache + mod_wsgi で動かすことを想定しています。
インストール
Apache
Apache は CentOS 7 の標準パッケージを使用します。
$ sudo yum install -y httpd
mod_wsgi
Python を Apache で動かすためのモジュール mod_wsgi は pip でインストールします。
mod_wsgi をインストールする前に、mod_wsgi に必要なパッケージをインストールします。
$ sudo yum install -y httpd-devel gcc
これをしないと、’apxs’ や ‘gcc’ というエラーが出ます。
それでは、mod_wsgi をインストールします。
$ sudo pip3.6 install mod_wsgi
設定ファイルを環境毎に切り替える
settings.py を3つのファイルに分ける
Django で startproject すると、settings.py が作られます。
[vagrant@localhost ~]$ django-admin startproject myproject [vagrant@localhost ~]$ cd myproject/ [vagrant@localhost myproject]$ tree . ├── manage.py └── myproject ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py 1 directory, 5 files [vagrant@localhost myproject]$
それをこうします。
[vagrant@localhost myproject]$ tree . ├── manage.py └── myproject ├── __init__.py ├── settings | ├── common.py | ├── dev.py | └── prod.py ├── urls.py └── wsgi.py 2 directories, 7 files [vagrant@localhost myproject]$
まず、settings のディレクトリを作り、共通用に common.py、環境用に dev.py 本番用に prod.py という3ファイルを作成しています。
そして、dev.py と prod.py の一番上で以下のように common.py を読み込みます。
from .common import *
manage.py の修正
manage.py は、主に runserver で使用しますので、 “myproject.settings” となっている箇所を “myproject.settings.dev” に修正します。
#!/usr/bin/env python import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings.dev") try: from django.core.management import execute_from_command_line except ImportError as exc: raise ImportError( "Couldn't import Django. Are you sure it's installed and " "available on your PYTHONPATH environment variable? Did you " "forget to activate a virtual environment?" ) from exc execute_from_command_line(sys.argv)
wsgi.py の修正
wsgi.py は Apache で使用しますので、”myproject.settings” を “myproject.settings.prod” に修正します。
""" WSGI config for myproject project. It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/ """ import os from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings.prod") application = get_wsgi_application()
環境毎に Django を起動する
開発環境での起動
普通に runserver を起動するだけですね。settings ではなく、settings.dev を読み込んでいるのがログで確認できます。
[vagrant@localhost myproject]$ python3.6 manage.py runserver 0.0.0.0:8000 Performing system checks... System check identified no issues (0 silenced). You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them. April 06, 2018 - 01:44:54 Django version 2.0.3, using settings 'myproject.settings.dev' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C.
DB の migrate に関するメッセージが出ていますが、とりあえず起動はできましたので、ここから開発が進められます。
本番環境での起動
runserver での開発が完了したら、本番用の Apache + mod_wsgi で Django を起動します。本当は、mod_wsgi の daemon mode が良いのですが、今回は embedded mode で起動したいと思います。
SELinux
今回は、SELinux を無効にします。
sudo setenforce 0
パーミッション
プログラムを /home に配置した場合、パーミッションの関係で、Apache が参照することが出来ないので、パーミッションを設定しておきます。
[vagrant@localhost ~]$ chmod +x /home/vagrant/
これをしないと、403 Forbidden になります。
Apache の設定ファイルを作成
Apache の設定ファイルを /etc/httpd/conf.d に myproject.conf として作成します。
LoadModule wsgi_module /usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so</pre> WSGIScriptAlias / /home/vagrant/myproject/myproject/wsgi.py WSGIPythonPath /home/vagrant/myproject <Directory /home/vagrant/myproject/myproject> <Files wsgi.py> Require all granted </Files> </Directory>
prod.py を少し修正
外部ネットワークのブラウザから確認したいので、ALLOWED_HOSTS に ‘*’ を設定しておきます。
ALLOWED_HOSTS = ['*']
Apache の起動
準備が整いましたので、Apache を起動します。
[vagrant@localhost ~]$ sudo systemctl start httpd
ブラウザでアクセスしてみて、以下のようになれば OK です。
まとめ
Django 設定ファイル settings.py の環境毎の切り替え方法について説明しました。
開発環境は dev.py、本番環境は prod.py、共通の設定は common.py を使用しました。
さらに、runserver と Apache から、どのように設定ファイルを読み込むかの方法についても説明しました。
切り替え方法で困っている人がこの記事を見て、少しでも参考になってくれれば嬉しいです。