Debian8のDjangoアプリケーションでPostgresqlを使用する方法
序章
Djangoは、Pythonアプリケーションをすばやく作成するための柔軟なフレームワークです。 デフォルトでは、Djangoアプリケーションはデータを軽量のSQLiteデータベースファイルに保存するように構成されています。 これはいくつかの負荷の下でうまく機能しますが、より伝統的なDBMSは本番環境でのパフォーマンスを向上させることができます。
このガイドでは、Djangoアプリケーションで使用するPostgreSQLをインストールして構成する方法を示します。 必要なソフトウェアをインストールし、アプリケーションのデータベースクレデンシャルを作成してから、このバックエンドを使用するように新しいDjangoプロジェクトを開始して構成します。
前提条件
開始するには、root以外のユーザーが設定されたクリーンなDebian8サーバーインスタンスが必要です。 非rootユーザーは、sudo
権限で構成する必要があります。 初期サーバーセットアップガイドに従って、これをセットアップする方法を学びます。
続行する準備ができたら、sudo
ユーザーとしてログインし、読み進めます。
Debianリポジトリからコンポーネントをインストールする
最初のステップは、リポジトリから必要なすべてのピースをインストールすることです。 Pythonコンポーネントをインストールして管理するために、Pythonパッケージマネージャーであるpip
をインストールします。 また、データベースソフトウェアとそれらとの対話に必要な関連ライブラリをインストールします。
Python2とPython3はわずかに異なるパッケージを必要とするため、プロジェクトのPythonバージョンに一致する以下のコマンドを選択してください。
Python 2 を使用している場合は、次のように入力します。
- sudo apt-get update
- sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib
Python 3 を使用している場合は、次のように入力します。
- sudo apt-get update
- sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib
インストールが邪魔にならないので、データベースとデータベースユーザーの作成に進むことができます。
データベースとデータベースユーザーを作成する
デフォルトでは、Postgresはローカル接続に「ピア認証」と呼ばれる認証スキームを使用します。 基本的に、これは、ユーザーのオペレーティングシステムのユーザー名が有効なPostgresユーザー名と一致する場合、そのユーザーはそれ以上の認証なしでログインできることを意味します。
Postgresのインストール中に、postgres
という名前のオペレーティングシステムユーザーが、postgres
PostgreSQL管理ユーザーに対応するように作成されました。 このユーザーを使用して管理タスクを実行する必要があります。 sudo
を使用して、-u
オプションを使用してユーザー名を渡すことができます。
次のように入力して、インタラクティブなPostgresセッションにログインします。
- sudo -u postgres psql
まず、Djangoプロジェクトのデータベースを作成します。 セキュリティ上の理由から、各プロジェクトには独自の分離データベースが必要です。 このガイドではデータベースをmyproject
と呼びますが、実際のプロジェクトでは、よりわかりやすいものを選択することをお勧めします。
注:すべてのコマンドをSQLプロンプトでセミコロンで終了することを忘れないでください。
- CREATE DATABASE myproject;
OutputCREAT DATABASE
次に、データベースへの接続とデータベースの操作に使用するデータベースユーザーを作成します。 パスワードを強力で安全なものに設定します。
- CREATE USER myprojectuser WITH PASSWORD 'password';
OutputCREATE ROLE
次に、作成したユーザーの接続パラメーターのいくつかを変更します。 これにより、接続が確立されるたびに正しい値を照会して設定する必要がなくなるため、データベース操作が高速化されます。
デフォルトのエンコーディングをUTF-8に設定しています。これは、Djangoが期待する形式です。 また、デフォルトのトランザクション分離スキームを「読み取りコミット」に設定しています。これは、コミットされていないトランザクションからの読み取りをブロックします。 最後に、タイムゾーンを設定します。 デフォルトでは、DjangoプロジェクトはUTC
を使用するように設定されます。 これらはすべて、Djangoプロジェクト自体からの推奨事項です。
- 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';
OutputALTER ROLE
ALTER ROLE
ALTER ROLE
これで、作成したデータベースへのアクセス権をデータベースユーザーに付与するだけで済みます。
- GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
OutputGRANT
終了したら、SQLプロンプトを終了します。
- \q
これで、前のシェルセッションに戻るはずです。
仮想環境内にDjangoをインストールする
データベースがセットアップされたので、Djangoをインストールできます。 柔軟性を高めるために、Python仮想環境内にDjangoとそのすべての依存関係をインストールします。 virtualenv
パッケージを使用すると、これらの環境を簡単に作成できます。
Python 2 を使用している場合は、次のように入力して正しいパッケージをインストールできます。
- sudo pip install virtualenv
Python 3 を使用している場合は、次のように入力して正しいパッケージをインストールできます。
- sudo pip3 install virtualenv
Djangoプロジェクトを保持するディレクトリを作成して移動します。
- mkdir ~/myproject
- cd ~/myproject
次のように入力することで、DjangoプロジェクトのPython要件を保存する仮想環境を作成できます。
- virtualenv venv
これにより、Pythonのローカルコピーとローカルのpip
コマンドが、プロジェクトディレクトリ内のvenv
というディレクトリにインストールされます。
仮想環境内にアプリケーションをインストールする前に、それをアクティブ化する必要があります。 次のように入力してください。
- source venv/bin/activate
プロンプトが変わり、仮想環境内で操作していることを示します。 このようになります(venv)user@host:~/myproject$
。
仮想環境がアクティブになったら、pip
を使用してDjangoをインストールできます。 また、構成したデータベースを使用できるようにするpsycopg2
パッケージもインストールします。
ノート
使用しているPythonのバージョンに関係なく、仮想環境がアクティブ化されている場合は、pip
コマンドを使用する必要があります(pip3
ではありません)。
- pip install django psycopg2
これで、myproject
ディレクトリ内でDjangoプロジェクトを開始できます。 これにより、コード自体を保持する同じ名前の子ディレクトリが作成され、現在のディレクトリ内に管理スクリプトが作成されます。
注:コマンドの最後にドットを追加して、正しく設定されるようにしてください。 仮想環境ディレクトリを保持するための親プロジェクトディレクトリをすでに作成しているため、ドットを省略した場合に作成される追加のディレクトリレベルは必要ありません。
- django-admin.py startproject myproject .
現在のディレクトリ構造は次のようになります。
.
└── ./myproject/
├── manage.py
├── myproject/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── venv/
└── . . .
ご覧のとおり、manage.py
スクリプトを保持する親プロジェクトディレクトリ、内部プロジェクトディレクトリ、および前に作成したvenv
仮想環境ディレクトリがあります。
Djangoデータベース設定を構成する
プロジェクトができたので、作成したデータベースを使用するようにプロジェクトを構成する必要があります。
子プロジェクトディレクトリ内にあるメインのDjangoプロジェクト設定ファイルを開きます。
- nano ~/myproject/myproject/settings.py
データベースを設定する前に、ALLOWED_HOSTS
ディレクティブを調整する必要がある場合もあります。 これは、Djangoインスタンスへの接続に使用できるアドレスまたはドメイン名のホワイトリストを定義します。 このリストにないHostヘッダーを持つ着信要求は、例外を発生させます。 Djangoでは、特定のクラスのセキュリティの脆弱性を防ぐためにこれを設定する必要があります。
角かっこ内に、Djangoサーバーに関連付けられているIPアドレスまたはドメイン名をリストします。 各項目は、引用符で、エントリをコンマで区切ってリストする必要があります。 ドメインおよびサブドメインの要求に応答する場合は、エントリの先頭にピリオドを追加します。 以下のスニペットには、エントリをフォーマットする正しい方法を示すために使用されるコメントアウトされた例がいくつかあります。
. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . .]
次に、次のような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
- ./manage.py makemigrations
- ./manage.py migrate
データベース構造を作成したら、次のように入力して管理者アカウントを作成できます。
- ./manage.py createsuperuser
ユーザー名を選択し、メールアドレスを入力し、アカウントのパスワードを選択して確認するように求められます。
注:開発サーバーを試す前に、ファイアウォールでポートを開いていることを確認してください。
ufw
ファイアウォールを実行している場合は、次のように入力して適切なポートを開くことができます。
- sudo ufw allow 8000
iptables
ファイアウォールを実行している場合、必要な正確なコマンドは、現在のファイアウォール構成によって異なります。 ほとんどの構成の場合、次のコマンドが機能するはずです。
- sudo iptables -I INPUT -p tcp --dport 8000 -j ACCEPT
次に、Django開発サーバーを起動して、データベースが正しく実行されていることをテストできます。
- ./manage.py runserver 0.0.0.0:8000
Webブラウザーで、サーバーのドメイン名またはIPアドレスにアクセスし、続いて:8000
にアクセスして、デフォルトのDjangoルートページにアクセスします。
http://server_domain_or_IP:8000
デフォルトのインデックスページが表示されます。
URLの最後に/admin
を追加すると、管理インターフェースへのログイン画面にアクセスできるようになります。
createsuperuser
コマンドを使用して作成したユーザー名とパスワードを入力します。 次に、管理インターフェースに移動します。
調査が終了したら、ターミナルウィンドウでCTRL-Cを押して開発サーバーを停止できます。
管理インターフェースにアクセスすることにより、データベースにユーザーアカウント情報が保存されており、適切にアクセスできることを確認しました。
psql
クライアントを使用してPostgresデータベース自体にクエリを実行することで、これをさらに検証できます。 たとえば、プロジェクトのユーザー(myprojectuser
)を使用してプロジェクトデータベース(myproject
)に接続し、次のように入力して、使用可能なすべてのテーブルを印刷できます。
- psql -W myproject myprojectuser -h 127.0.0.1 -f <(echo '\dt')
-W
フラグにより、psql
は適切なパスワードの入力を求めます。 -h
フラグを明示的に使用して、ネットワーク経由でローカルホストに接続し、ピア認証の代わりにパスワード認証を使用することを示す必要があります。 -f
フラグを使用して、実行するpsql
メタコマンド\dt
を渡します。これにより、データベース内のすべてのテーブルが一覧表示されます。
Output List of relations
Schema | Name | Type | Owner
--------+----------------------------+-------+---------------
public | auth_group | table | myprojectuser
public | auth_group_permissions | table | myprojectuser
public | auth_permission | table | myprojectuser
public | auth_user | table | myprojectuser
public | auth_user_groups | table | myprojectuser
public | auth_user_user_permissions | table | myprojectuser
public | django_admin_log | table | myprojectuser
public | django_content_type | table | myprojectuser
public | django_migrations | table | myprojectuser
public | django_session | table | myprojectuser
(10 rows)
ご覧のとおり、Djangoはデータベース内にいくつかのテーブルを作成し、設定が有効であることを確認しています。
結論
このガイドでは、PostgreSQLをDjangoプロジェクトのバックエンドデータベースとしてインストールおよび構成する方法を示しました。 SQLiteは開発中および軽生産での使用中に負荷を簡単に処理できますが、ほとんどのプロジェクトは、よりフル機能のDBMSを実装することで恩恵を受けます。