序章

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

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

前提条件

開始するには、root以外のユーザーが設定されたクリーンなDebian8サーバーインスタンスが必要です。 非rootユーザーは、sudo権限で構成する必要があります。 初期サーバーセットアップガイドに従って、これをセットアップする方法を学びます。

続行する準備ができたら、sudoユーザーとしてログインし、読み進めます。

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

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

Python2とPython3はわずかに異なるパッケージを必要とするため、プロジェクトのPythonバージョンに一致する以下のコマンドを選択してください。

Python 2 を使用している場合は、次のように入力します。

  1. sudo apt-get update
  2. sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib

Python 3 を使用している場合は、次のように入力します。

  1. sudo apt-get update
  2. sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib

インストールが邪魔にならないので、データベースとデータベースユーザーの作成に進むことができます。

データベースとデータベースユーザーを作成する

デフォルトでは、Postgresはローカル接続に「ピア認証」と呼ばれる認証スキームを使用します。 基本的に、これは、ユーザーのオペレーティングシステムのユーザー名が有効なPostgresユーザー名と一致する場合、そのユーザーはそれ以上の認証なしでログインできることを意味します。

Postgresのインストール中に、postgresという名前のオペレーティングシステムユーザーが、postgresPostgreSQL管理ユーザーに対応するように作成されました。 このユーザーを使用して管理タスクを実行する必要があります。 sudoを使用して、-uオプションを使用してユーザー名を渡すことができます。

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

  1. sudo -u postgres psql

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

注:すべてのコマンドをSQLプロンプトでセミコロンで終了することを忘れないでください。

  1. CREATE DATABASE myproject;
Output
CREAT DATABASE

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

  1. CREATE USER myprojectuser WITH PASSWORD 'password';
Output
CREATE ROLE

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

デフォルトのエンコーディングをUTF-8に設定しています。これは、Djangoが期待する形式です。 また、デフォルトのトランザクション分離スキームを「読み取りコミット」に設定しています。これは、コミットされていないトランザクションからの読み取りをブロックします。 最後に、タイムゾーンを設定します。 デフォルトでは、DjangoプロジェクトはUTCを使用するように設定されます。 これらはすべて、Djangoプロジェクト自体からの推奨事項です。

  1. ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
  2. ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
  3. ALTER ROLE myprojectuser SET timezone TO 'UTC';
Output
ALTER ROLE ALTER ROLE ALTER ROLE

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

  1. GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
Output
GRANT

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

  1. \q

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

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

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

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

  1. sudo pip install virtualenv

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

  1. sudo pip3 install virtualenv

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

  1. mkdir ~/myproject
  2. cd ~/myproject

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

  1. virtualenv venv

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

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

  1. source venv/bin/activate

プロンプトが変わり、仮想環境内で操作していることを示します。 このようになります(venv)user@host:~/myproject$

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

ノート

使用しているPythonのバージョンに関係なく、仮想環境がアクティブ化されている場合は、pipコマンドを使用する必要があります(pip3ではありません)。

  1. pip install django psycopg2

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

注:コマンドの最後にドットを追加して、正しく設定されるようにしてください。 仮想環境ディレクトリを保持するための親プロジェクトディレクトリをすでに作成しているため、ドットを省略した場合に作成される追加のディレクトリレベルは必要ありません。

  1. django-admin.py startproject myproject .

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

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

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

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

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

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

  1. nano ~/myproject/myproject/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 = ['your_server_domain_or_IP', 'second_domain_or_IP', . . .]

次に、次のような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 / myproject / settings.py
. . .

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

. . .

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

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

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

まず、データベースへの移行を作成して適用することから始めます。 実際のデータはまだないので、これで初期データベース構造が設定されます。

  1. cd ~/myproject
  2. ./manage.py makemigrations
  3. ./manage.py migrate

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

  1. ./manage.py createsuperuser

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

注:開発サーバーを試す前に、ファイアウォールでポートを開いていることを確認してください。

ufwファイアウォールを実行している場合は、次のように入力して適切なポートを開くことができます。

  1. sudo ufw allow 8000

iptablesファイアウォールを実行している場合、必要な正確なコマンドは、現在のファイアウォール構成によって異なります。 ほとんどの構成の場合、次のコマンドが機能するはずです。

  1. sudo iptables -I INPUT -p tcp --dport 8000 -j ACCEPT

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

  1. ./manage.py runserver 0.0.0.0:8000

Webブラウザーで、サーバーのドメイン名またはIPアドレスにアクセスし、続いて:8000にアクセスして、デフォルトのDjangoルートページにアクセスします。

http://server_domain_or_IP:8000

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

Django index

URLの最後に/adminを追加すると、管理インターフェースへのログイン画面にアクセスできるようになります。

Django admin login

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

Django admin interface

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

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

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

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