CentOS7のDjangoアプリケーションでPostgreSQLを使用する方法
序章
Djangoは、Pythonアプリケーションをすばやく作成するための柔軟なフレームワークです。 デフォルトでは、Djangoアプリケーションはデータを軽量のSQLiteデータベースファイルに保存するように構成されています。 これはいくつかの負荷の下でうまく機能しますが、より伝統的なDBMSは本番環境でのパフォーマンスを向上させることができます。
このガイドでは、Djangoアプリケーションで使用するPostgreSQLをインストールして構成する方法を示します。 必要なソフトウェアをインストールし、アプリケーションのデータベースクレデンシャルを作成してから、このバックエンドを使用するように新しいDjangoプロジェクトを開始して構成します。
前提条件
開始するには、root以外のユーザーが設定されたクリーンなCentOS7サーバーインスタンスが必要です。 非rootユーザーは、sudo
権限で構成する必要があります。 初期サーバーセットアップガイドに従って、これをセットアップする方法を学びます。
続行する準備ができたら、読み進めてください。
CentOSおよびEPELリポジトリからコンポーネントをインストールします
最初のステップは、リポジトリから必要なすべてのピースをインストールすることです。 Pythonコンポーネントをインストールして管理するために、Pythonパッケージマネージャーであるpip
をインストールします。 また、データベースソフトウェアとそれらとの対話に必要な関連ライブラリをインストールします。
必要なソフトウェアの一部は、追加のパッケージを含むEPELリポジトリにあります。 次のように結び付けることで、このリポジトリを簡単に有効にできます。
sudo yum install epel-release
EPELを有効にすると、次のように入力して必要なコンポーネントをインストールできます。
sudo yum install python-pip python-devel gcc postgresql-server postgresql-devel postgresql-contrib
PostgreSQLの初期構成を実行する
インストール後、次のように入力してPostgreSQLデータベースを初期化する必要があります。
sudo postgresql-setup initdb
データベースが初期化されたら、次のように入力してPostgreSQLサービスを開始できます。
sudo systemctl start postgresql
データベースを起動したら、実際に入力された構成ファイルの1つで値を調整する必要があります。 エディタとsudo
コマンドを使用して、今すぐファイルを開きます。
sudo nano /var/lib/pgsql/data/pg_hba.conf
このファイルは、データベースシステムの認証方法を構成する役割を果たします。 現在、システムユーザーがデータベースユーザーと一致する場合にのみ接続を許可するように構成されています。 これはローカルメンテナンスタスクには問題ありませんが、Djangoインスタンスにはパスワードで構成された別のユーザーがいます。
これは、ファイルの下部にある2つのhost
行を変更することで構成できます。 最後の列(認証方法)をmd5
に変更します。 これにより、パスワード認証が可能になります。
. . .
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
#host all all 127.0.0.1/32 ident
host all all 127.0.0.1/32 md5
# IPv6 local connections:
#host all all ::1/128 ident
host all all ::1/128 md5
終了したら、ファイルを保存して閉じます。
新しい構成の変更に伴い、サービスを再起動する必要があります。 また、PostgreSQLを有効にして、起動時に自動的に起動するようにします。
sudo systemctl restart postgresql
sudo systemctl enable postgresql
データベースとデータベースユーザーを作成する
デフォルトでは、Postgresはローカル接続に「ピア認証」と呼ばれる認証スキームを使用します。 これは、編集したpg_hba.conf
ファイルのlocal
エントリで確認できます。 基本的に、これは、ユーザーのオペレーティングシステムのユーザー名が有効なPostgresユーザー名と一致する場合、そのユーザーはそれ以上の認証なしでログインできることを意味します。
Postgresのインストール中に、postgres
という名前のオペレーティングシステムユーザーが、postgres
PostgreSQL管理ユーザーに対応するように作成されました。 管理タスクを実行するには、このユーザーに変更する必要があります。
sudo su - postgres
これで、postgres
ユーザーのシェルセッションに入るはずです。 次のように入力して、Postgresセッションにログインします。
psql
まず、Djangoプロジェクトのデータベースを作成します。 セキュリティ上の理由から、各プロジェクトには独自の分離データベースが必要です。 このガイドではデータベースをmyproject
と呼びますが、よりわかりやすいものを選択することをお勧めします。
CREATE DATABASE myproject;
SQLプロンプトですべてのコマンドをセミコロンで終了することを忘れないでください。
次に、データベースへの接続とデータベースの操作に使用するデータベースユーザーを作成します。 パスワードを強力で安全なものに設定します。
CREATE USER myprojectuser WITH PASSWORD 'password';
その後、作成したユーザーの接続パラメーターのいくつかを変更します。 これにより、データベース操作が高速化されるため、接続が確立されるたびに正しい値を照会して設定する必要がなくなります。
Djangoが期待するデフォルトのエンコーディングをUTF-8に設定しています。 また、デフォルトのトランザクション分離スキームを「読み取りコミット」に設定しています。これは、コミットされていないトランザクションからの読み取りをブロックします。 最後に、タイムゾーンを設定します。 デフォルトでは、DjangoプロジェクトはUTC
を使用するように設定されています。
ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';
これで、作成したデータベースへのアクセス権をデータベースユーザーに付与するだけで済みます。
GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
SQLプロンプトを終了して、postgresユーザーのシェルセッションに戻ります。
\q
postgres
ユーザーのシェルセッションを終了して、通常のユーザーのシェルセッションに戻ります。
exit
仮想環境内にDjangoをインストールする
データベースがセットアップされたので、Djangoをインストールできます。 柔軟性を高めるために、Python仮想環境内にDjangoとそのすべての依存関係をインストールします。
次のように入力することで、これらの環境を作成できるvirtualenv
パッケージを入手できます。
sudo pip install virtualenv
Djangoプロジェクトを保持するディレクトリを作成します。 その後、ディレクトリに移動します。
mkdir ~/myproject
cd ~/myproject
次のように入力することで、DjangoプロジェクトのPython要件を保存する仮想環境を作成できます。
virtualenv myprojectenv
これにより、Pythonとpip
のローカルコピーが、プロジェクトディレクトリ内のmyprojectenv
というディレクトリにインストールされます。
仮想環境内にアプリケーションをインストールする前に、それをアクティブ化する必要があります。 次のように入力してください。
source myprojectenv/bin/activate
プロンプトが変わり、仮想環境内で操作していることを示します。 このようになります(myprojectenv)user@host:~/myproject$
。
仮想環境がアクティブになったら、pip
を使用してDjangoをインストールできます。 また、構成したデータベースを使用できるようにするpsycopg2
パッケージもインストールします。
pip install django psycopg2
これで、myproject
ディレクトリ内でDjangoプロジェクトを開始できます。 これにより、コード自体を保持する同じ名前の子ディレクトリが作成され、現在のディレクトリ内に管理スクリプトが作成されます。 これが正しく設定されるように、コマンドの最後にドットを追加してください。
django-admin.py startproject myproject .
Djangoデータベース設定を構成する
プロジェクトができたので、作成したデータベースを使用するようにプロジェクトを構成する必要があります。
子プロジェクトディレクトリ内にあるメインのDjangoプロジェクト設定ファイルを開きます。
nano ~/myproject/myproject/settings.py
ファイルの下部に、次のようなDATABASES
セクションが表示されます。
. . .
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
. . .
これは現在、SQLiteをデータベースとして使用するように構成されています。 代わりにPostgreSQLデータベースが使用されるように、これを変更する必要があります。
まず、sqlite3
バックエンドではなくpostgresql_psycopg2
バックエンドを指すようにエンジンを変更します。 NAME
には、データベースの名前(この例ではmyproject
)を使用します。 また、ログイン資格情報を追加する必要があります。 接続するには、ユーザー名、パスワード、およびホストが必要です。 デフォルトが選択されるように、ポートオプションを追加して空白のままにします。
. . .
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
. . .
終了したら、ファイルを保存して閉じます。
データベースを移行してプロジェクトをテストする
Django設定が構成されたので、データ構造をデータベースに移行してサーバーをテストできます。
まず、データベースへの移行を作成して適用することから始めます。 実際のデータはまだないので、これで初期データベース構造が設定されます。
cd ~/myproject
python manage.py makemigrations
python manage.py migrate
データベース構造を作成したら、次のように入力して管理者アカウントを作成できます。
python manage.py createsuperuser
ユーザー名を選択し、メールアドレスを入力し、アカウントのパスワードを選択して確認するように求められます。
管理者アカウントを設定したら、Django開発サーバーを起動して、データベースが正しく機能していることをテストできます。
python manage.py runserver 0.0.0.0:8000
Webブラウザーで、サーバーのドメイン名またはIPアドレスにアクセスし、続いて:8000
にアクセスして、デフォルトのDjangoルートページにアクセスします。
http://server_domain_or_IP:8000
デフォルトのインデックスページが表示されます。
URLの最後に/admin
を追加すると、管理インターフェースへのログイン画面にアクセスできるようになります。
createsuperuser
コマンドを使用して作成したユーザー名とパスワードを入力します。 次に、管理インターフェースに移動します。
調査が終了したら、ターミナルウィンドウでCTRL-Cを押して開発サーバーを停止できます。
管理インターフェースにアクセスすることにより、データベースにユーザーアカウント情報が保存されており、適切にアクセスできることを確認しました。
結論
このガイドでは、PostgreSQLをDjangoプロジェクトのバックエンドデータベースとしてインストールおよび構成する方法を示しました。 SQLiteは開発中および軽生産での使用中に負荷を簡単に処理できますが、ほとんどのプロジェクトは、よりフル機能のDBMSを実装することで恩恵を受けます。