Debian 8でDjangoアプリケーションでPostgresqlを使用する方法

前書き

Djangoは、Pythonアプリケーションをすばやく作成するための柔軟なフレームワークです。 デフォルトでは、Djangoアプリケーションはデータを軽量のSQLiteデータベースファイルに保存するように設定されています。 これはいくつかの負荷の下でうまく機能しますが、より伝統的なDBMSは本番環境のパフォーマンスを改善できます。

このガイドでは、Djangoアプリケーションで使用するためにPostgreSQLをインストールおよび構成する方法を示します。 必要なソフトウェアをインストールし、アプリケーションのデータベース資格情報を作成してから、このバックエンドを使用するために新しいDjangoプロジェクトを開始および構成します。

前提条件

始めるには、root以外のユーザーが設定されたクリーンなDebian 8サーバーインスタンスが必要です。 非rootユーザーは、 `+ sudo +`特権で設定する必要があります。 https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-8 [初期サーバー設定ガイド]に従って、これを設定する方法を学びます。

続行する準備ができたら、 `+ sudo +`ユーザーとしてログインして読み直してください。

Debianリポジトリからコンポーネントをインストールする

最初のステップは、リポジトリから必要なすべてのピースをインストールすることです。 Pythonコンポーネントをインストールおよび管理するために、Pythonパッケージマネージャーである `+ pip +`をインストールします。 データベースソフトウェアと、それらと対話するために必要な関連ライブラリもインストールします。

Python 2とPython 3にはわずかに異なるパッケージが必要なので、プロジェクトの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 + PostgreSQL管理ユーザーに対応するために、 `+ postgres `という名前のオペレーティングシステムユーザーが作成されました。 このユーザーを使用して管理タスクを実行する必要があります。 ` sudo `を使用し、 ` -u +`オプションでユーザー名を渡すことができます。

次のように入力して、インタラクティブなPostgresセッションにログインします。

sudo -u postgres psql

最初に、Djangoプロジェクトのデータベースを作成します。 セキュリティ上の理由から、各プロジェクトには独自の独立したデータベースが必要です。 このガイドではデータベースを「++」と呼びますが、実際のプロジェクトをよりわかりやすいものを選択することをお勧めします。

CREATE DATABASE ;
OutputCREAT DATABASE

次に、データベースに接続して対話するために使用するデータベースユーザーを作成します。 パスワードを強力で安全なものに設定します。

CREATE USER  WITH PASSWORD '';
OutputCREATE ROLE

次に、作成したユーザーの接続パラメーターのいくつかを変更します。 これにより、接続が確立されるたびに正しい値を照会および設定する必要がなくなるため、データベース操作が高速化されます。

デフォルトのエンコーディングをUTF-8に設定しています。これはDjangoが期待する形式です。 また、デフォルトのトランザクション分離スキームを「コミット済み読み取り」に設定しています。これは、コミットされていないトランザクションからの読み取りをブロックします。 最後に、タイムゾーンを設定しています。 デフォルトでは、Djangoプロジェクトは `+ UTC`を使用するように設定されます。 これらはすべてhttps://docs.djangoproject.com/en/1.10/ref/databases/#optimizing-postgresql-s-configuration[Djangoプロジェクト自体]からの推奨事項です。

ALTER ROLE  SET client_encoding TO 'utf8';
ALTER ROLE  SET default_transaction_isolation TO 'read committed';
ALTER ROLE  SET timezone TO 'UTC';
OutputALTER ROLE
ALTER ROLE
ALTER ROLE

これで、データベースユーザーに、作成したデータベースへのアクセス権を与えるだけで済みます。

GRANT ALL PRIVILEGES ON DATABASE  TO ;
OutputGRANT

終了したら、SQLプロンプトを終了します。

\q

これで、以前のシェルセッションに戻るはずです。

仮想環境内にDjangoをインストールする

データベースがセットアップされたので、Djangoをインストールできます。 柔軟性を高めるために、Djangoとそのすべての依存関係をPython仮想環境内にインストールします。 `+ virtualenv +`パッケージを使用すると、これらの環境を簡単に作成できます。

  • Python 2 *を使用している場合は、次のように入力して正しいパッケージをインストールできます。

sudo pip install virtualenv
  • Python 3 *を使用している場合は、次のように入力して正しいパッケージをインストールできます。

sudo pip3 install virtualenv

Djangoプロジェクトを保持するディレクトリを作成して移動します。

mkdir ~/
cd ~/

次のように入力して、DjangoプロジェクトのPython要件を保存する仮想環境を作成できます。

virtualenv

これにより、Pythonのローカルコピーとローカルの「+ pip 」コマンドがプロジェクトディレクトリ内の「+」というディレクトリにインストールされます。

仮想環境内にアプリケーションをインストールする前に、アクティブ化する必要があります。 これを行うには、次のように入力します。

source /bin/activate

プロンプトが変わり、仮想環境内で操作していることが示されます。 この `+()@:〜/ $ +`のようになります。

仮想環境がアクティブになったら、Djangoを `+ pip `でインストールできます。 また、設定したデータベースを使用できるようにする ` psycopg2 +`パッケージもインストールします。

Note

pip install django psycopg2

これで、 `+ myproject +`ディレクトリ内でDjangoプロジェクトを開始できます。 これにより、コード自体を保持するために同じ名前の子ディレクトリが作成され、現在のディレクトリ内に管理スクリプトが作成されます。

django-admin.py startproject  .

現在のディレクトリ構造は次のようになります。

.
└── ./myproject/
   ├── manage.py
   ├── myproject/
   │   ├── __init__.py
   │   ├── settings.py
   │   ├── urls.py
   │   └── wsgi.py
   └── venv/
       └── . . .

ご覧のとおり、 + manage.py`スクリプトを保持する親プロジェクトディレクトリ、内部プロジェクトディレクトリ、先ほど作成した + venv`仮想環境ディレクトリがあります。

Djangoデータベース設定を構成する

プロジェクトができたので、作成したデータベースを使用するようにプロジェクトを構成する必要があります。

子プロジェクトディレクトリ内にあるメインのDjangoプロジェクト設定ファイルを開きます。

nano ~///settings.py

データベースをセットアップする前に、 `+ ALLOWED_HOSTS +`ディレクティブを調整する必要があるかもしれません。 これは、Djangoインスタンスへの接続に使用できるアドレスまたはドメイン名のホワイトリストを定義します。 このリストにない* Host *ヘッダーを持つ着信リクエストは例外を発生させます。 Djangoでは、特定のクラスのセキュリティ脆弱性を防ぐために、これを設定する必要があります。

角括弧内に、Djangoサーバーに関連付けられているIPアドレスまたはドメイン名をリストします。 各項目は*引用符で*エントリを*コンマで区切ってリストする必要があります。 ドメインおよびサブドメインの要求に応答する場合は、エントリの先頭にピリオドを追加します。 以下のスニペットには、エントリをフォーマットする正しい方法を示すために使用されるコメントアウトされた例がいくつかあります。

〜/ myproject / myproject / settings.py

. . .
# 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 = ['', '', ]

次に、次のような `+ DATABASES +`セクションを見つけます。

〜/ myproject / myproject / settings.py

. . .

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.sqlite3',
       'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
   }
}

. . .

これは現在、SQLiteをデータベースとして使用するように構成されています。 PostgreSQLデータベースが代わりに使用されるように、これを変更する必要があります。

まず、エンジンを変更して、 + sqlite3 +`アダプターの代わりに `+ postgresql_psycopg2 +`アダプターを使用するようにします。 `+ NAME +`には、データベースの名前を使用します(この例では `++)。 ログイン資格情報も追加する必要があります。 接続するためのユーザー名、パスワード、ホストが必要です。 デフォルトが選択されるように、ポートオプションを追加して空白のままにします。

〜/ myproject / myproject / settings.py

. . .

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.',
       'NAME': '',
       'USER': '',
       'PASSWORD': '',
       'HOST': 'localhost',
       'PORT': '',
   }
}

. . .

終了したら、ファイルを保存して閉じます。

データベースを移行してプロジェクトをテストする

Djangoの設定が構成されたので、データ構造をデータベースに移行し、サーバーをテストできます。

まず、データベースに移行を作成して適用することから始めます。 実際のデータはまだないため、これは単に初期データベース構造をセットアップするだけです。

cd ~/
./manage.py makemigrations
./manage.py migrate

データベース構造を作成したら、次のように入力して管理アカウントを作成できます。

./manage.py createsuperuser

ユーザー名の選択、メールアドレスの入力、アカウントのパスワードの選択と確認を求められます。

次に、Django開発サーバーを起動して、データベースが正しく実行されていることをテストできます。

./manage.py runserver 0.0.0.0:8000

ウェブブラウザで、サーバーのドメイン名またはIPアドレスにアクセスし、その後に「:8000」を入力して、デフォルトのDjangoルートページにアクセスします。

http://:8000

デフォルトのインデックスページが表示されます。

画像:https://assets.digitalocean.com/articles/django_mysql_1404/django_index.png [Django index]

URLの最後に「+ / admin +」を追加すると、管理画面のログイン画面にアクセスできるはずです。

画像:https://assets.digitalocean.com/articles/django_mysql_1404/admin_login.png [Django admin login]

`+ createsuperuser +`コマンドを使用して作成したユーザー名とパスワードを入力します。 次に、管理インターフェイスに移動します。

image:https://assets.digitalocean.com/articles/django_mysql_1404/admin_interface.png [Django admin interface]

調査が終了したら、ターミナルウィンドウでCTRL-Cを押して開発サーバーを停止できます。

管理インターフェイスにアクセスすることで、データベースにユーザーアカウント情報が保存され、適切にアクセスできることを確認しました。

+ psql +`クライアントを使用してPostgresデータベース自体をクエリすることで、これをさらに検証できます。 たとえば、プロジェクトのユーザー( `+ myprojectuser +)を使用してプロジェクトデータベース( + myproject +)に接続し、次のように入力して使用可能なすべてのテーブルを印刷できます。

psql -W   -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を実装することで恩恵を受けます。

Related