djangoをとりあえず使ってみる

とりあえず、djangoを使ってみるために、apache2が動いているサーバーに追加してみます。 サーバーは Ubuntu 20.04 LTS です。

Step 1: python3のインストール

venvで仮想環境下にインストールをしたいので、次のコマンドでインストールします。


sudo apt-get install python3-venv python3-pip

次に、仮想環境を任意の場所に作成します。あとで、othersの読み込みアクセスが必要になるので、 /home/user以下ではない方がよいかもしれません。ここでは、/var/django/を作成して その下に作ることにします。


python3 -m venv env
source env/bin/activate
(env)$

この仮想環境下に、これからインストールします。 source env/bin/activateで仮想環境に入ると、 プロンプトの前に(env)と環境名がつきます。

これからの手順は、この仮想環境下で行うようにします。

Step 2: Djangoのインストール

pip を使って、Djangoをインストールします。


python -m pip install Django

Step 3: apache2のmod_wsgiモジュールのインストール

apacheで、pythonを実行するモジュールである mod_wsgiモジュールをインストールします。

pipで仮想環境下にインストールしますが、追加でモジュールが必要になるので先に入れておきます。


sudo apt-get install apache2-dev python3-setuptools git
pip install mod_wsgi

インストールが済んだら、次のコマンドでパスを確認します。


mod_wsgi-express module-config

Step 4: PostgreSQLのインストール

デフォルトでDBがあるので要らないのですが、将来的に使うことを考えPostgreSQLをインストールします。


sudo apt install postgresql
psql --version

また、仮想環境下に、psycopg2 をインストールします。


pip install psycopg2-binary

Step 5: DBの作成

これからのテストプロジェクトで使うデータベースを作成してみます。


sudo -u postgres psql

test1という名前のデーターベースを作成します。


CREATE DATABASE test1;

データーベースにアクセスするユーザーを作成します。 ここでは django ユーザーとし、パスワードは pass とします。


CREATE USER django WITH PASSWORD 'pass';
ALTER ROLE django SET client_encoding TO 'utf8';
ALTER ROLE django SET default_transaction_isolation TO 'read committed';
ALTER ROLE django SET timezone TO 'Asia/Tokyo';

作成した後の3つの設定は、Djangoの推奨設定への対応とタイムゾーンです。


GRANT ALL PRIVILEGES ON DATABASE test1 TO django;

django ユーザーに、test1 データーベースへの接続権を与えます。 終了するには、\qを入力します。

次に、認証方式をpeer認証からパスワードでの認証に変更します。


cd /etc/postgresql/12/main
sudo vim pg_hba.conf

バージョンのところは適宜読み替えてください。

ファイルの最後の方にある、local all all peer の行を探し、peermd5 に変更します。


# "local" is for Unix domain socket connections only
-local   all             all                                     peer
+local   all             all                                     md5

変更したら、サービスを再起動します。


sudo systemctl restart postgresql

接続できるか確認するには、


psql -U django -d test1

で接続します。設定したパスワードをプロンプトに対して入力します。 終了するには、\qを入力します。

Step 6: Djangoプロジェクトを作成する

コードを置きたい場所に移動して、仮想環境下でプロジェクトを作成します。


django-admin startproject test1

カレントディレクトリに、test1 フォルダが作成されます。 その中に入って、test1/settings.py という設定ファイルを修正します。


DATABASES = {
    'default': {
-       'ENGINE': 'django.db.backends.sqlite3',
+       'ENGINE': 'django.db.backends.postgresql_psycopg2',
-       'NAME': BASE_DIR / 'db.sqlite3',
+       'NAME': 'test1',
+       'USER': 'django',
+       'PASSWORD': 'pass',
+       'HOST': 'localhost',
+       'PORT': '',
    }
}

プロジェクトの、manage.py と同じディレクトリで、DBのマイグレーションを行います。


python manage.py makemigrations
python manage.py migrate

Step 7: スーパーユーザーの作成

スーパーユーザーを作成し、管理できるようにします。 プロジェクトの、manage.py と同じディレクトリで、createsuperuser を実行します。 いろいろと聞かれるので適当に回答します。


python manage.py createsuperuser

Step 8: 静的ファイルの公開

設定ファイルを修正します。test1/settings.pyを以下のようにします。 ALLOWED_HOSTS に自分のホスト名か * を入れてアクセスできるようにします。 ファイルの適当な場所に、STATIC_ROOT を加えます。


ALLOWED_HOSTS = ['*']
STATIC_ROOT = BASE_DIR / 'static'

次に、プロジェクトの、manage.py と同じディレクトリで、collectstatic を実行します。


python manage.py collectstatic

Step 9: apacheとdjangoを結ぶ

次のパス /etc/apache2/sites-available/django.conf に新規ファイルを以下の内容で作成します。


LoadModule wsgi_module /var/django/env/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so

WSGIDaemonProcess ichir.ai python-home=/var/django/env python-path=/var/django/test1
WSGIProcessGroup ichir.ai

WSGIScriptAlias /test1 /var/django/test1/test1/wsgi.py process-group=ichir.ai

<Directory /var/django/test1/test1>
        <Files wsgi.py>
                Require all granted
        </Files>
</Directory>

Alias /static /var/django/test1/static
<Directory /var/django/test1/static>
        Require all granted
</Directory>

ここで、LoadModule wsgi_moduleのパスと、WSGIPythonHomeのパスは、


mod_wsgi-express module-config

の出力結果を使います。パスは、環境に合わせて適宜読み替えてください。

次に、django.confを有効にします。


sudo a2ensite django
sudo systemctl restart apache2

Step 10: 管理画面にアクセスしてみる

ここまでの作業で、http(s)://example.com/test1/admin/ にアクセスすることで、管理画面が出るようになります。 先程設定したスーパーユーザーのアカウントでログインできるか確認してください。