Ubuntu20.04のDjangoアプリケーションでPostgreSQLを使用する方法
序章
Djangoは、Pythonアプリケーションをすばやく作成するための柔軟なフレームワークです。 デフォルトでは、Djangoアプリケーションはデータを軽量のSQLiteデータベースファイルに保存するように構成されています。 これはいくつかの負荷の下でうまく機能しますが、より伝統的なデータベース管理システムは本番環境でのパフォーマンスを向上させることができます。
このガイドでは、Djangoアプリケーションで使用するPostgreSQL(Postgresと呼ばれることもあります)をインストールして構成します。 必要なソフトウェアをインストールし、アプリケーションのデータベースクレデンシャルを作成してから、このバックエンドを使用するように新しいDjangoプロジェクトを開始して構成します。
前提条件
sudo
権限で構成されたroot以外のユーザーを持つクリーンなUbuntu20.04サーバーインスタンスが必要になります。 初期サーバーセットアップガイドに従って、これをセットアップする方法を学びます。
続行する準備ができたら、sudo
ユーザーとしてログインします。
ステップ1-Ubuntuリポジトリからコンポーネントをインストールする
まず、重要なコンポーネントをインストールします。 これには、pip
、Pythonコンポーネントをインストールおよび管理するためのPythonパッケージマネージャー、およびデータベースソフトウェアとそれに関連するライブラリが含まれます。
Ubuntu20.04に同梱されているPython3を使用します。 次のように入力して、インストールを開始します。
- sudo apt update
- sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib
インストールが邪魔にならないようにすると、データベースに移動できます。
ステップ2–データベースとデータベースユーザーの作成
デフォルトでは、Postgresはローカル接続に「ピア認証」と呼ばれる認証スキームを使用します。 基本的に、これは、ユーザーのオペレーティングシステムのユーザー名が有効なPostgresユーザー名と一致する場合、そのユーザーはそれ以上の認証なしでログインできることを意味します。
Postgresのインストール中に、 postgres という名前のオペレーティングシステムユーザーが、 postgresPostgreSQL管理ユーザーに対応するように作成されました。 管理タスクを実行するには、このユーザーを使用する必要があります。 sudo
を使用して、-u
オプションを使用してユーザー名を渡すことができます。
次のように入力して、インタラクティブなPostgresセッションにログインします。
- sudo -u postgres psql
まず、Djangoプロジェクトのデータベースを作成します。 セキュリティ上の理由から、各プロジェクトには独自の分離データベースが必要です。 このガイドではデータベースをmyproject
と呼びますが、よりわかりやすいものを選択することをお勧めします。
- CREATE DATABASE myproject;
ノート
SQLプロンプトですべてのコマンドをセミコロンで終了することを忘れないでください。
次に、データベースへの接続とデータベースの操作に使用するデータベースユーザーを作成します。 パスワードを強力で安全なものに設定します。
- CREATE USER myprojectuser WITH PASSWORD 'password';
その後、作成したユーザーの接続パラメーターのいくつかを変更します。 これにより、データベース操作が高速化されるため、接続が確立されるたびに正しい値を照会して設定する必要がなくなります。
- 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';
Djangoが期待するデフォルトのエンコーディングをUTF-8に設定しています。 また、デフォルトのトランザクション分離スキームを「読み取りコミット」に設定しています。これは、コミットされていないトランザクションからの読み取りをブロックします。 最後に、タイムゾーンを設定します。 デフォルトでは、DjangoプロジェクトはUTC
を使用するように設定されています。 これらはすべて、Djangoプロジェクト自体からの推奨事項です。
これで、作成したデータベースへのアクセス権をデータベースユーザーに付与するだけで済みます。
- GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
SQLプロンプトを終了して、postgresユーザーのシェルセッションに戻ります。
- \q
仮想環境内にDjangoをインストールする
データベースがセットアップされたので、Djangoをインストールできます。 柔軟性を高めるために、Python仮想環境内にDjangoとそのすべての依存関係をインストールします。 virtualenv
パッケージを使用すると、これらの環境を簡単に作成できます。
virtualenv
をインストールするには、次のように入力します。
- sudo pip3 install virtualenv
Djangoプロジェクトを保持するディレクトリを作成して移動します。
- mkdir ~/myproject
- cd ~/myproject
次のように入力して、DjangoプロジェクトのPython要件を保存する仮想環境を作成できます。
- python3 -m virtualenv myprojectenv
これにより、Pythonのローカルコピーとローカルのpip
コマンドが、プロジェクトディレクトリ内のmyprojectenv
というディレクトリにインストールされます。
仮想環境内にアプリケーションをインストールする前に、それをアクティブ化する必要があります。 次のように入力してください。
- source myprojectenv/bin/activate
プロンプトが変わり、仮想環境内で操作していることを示します。 このようになります(myprojectenv)user@host:~/myproject$
。
仮想環境がアクティブになったら、pip
を使用してDjangoの公式リリースをインストールできます。 また、psycopg2
パッケージをインストールして、構成したPostgresデータベースを使用できるようにします。
ノート
使用しているPythonのバージョンに関係なく、仮想環境がアクティブ化されている場合は、pip
コマンドを使用する必要があります(pip3
ではありません)。
- pip install Django psycopg2
これで、myproject
ディレクトリ内でDjangoプロジェクトを開始できます。 これにより、コード自体を保持する同じ名前の子ディレクトリが作成され、現在のディレクトリ内に管理スクリプトが作成されます。 これが正しく設定されるように、コマンドの最後にドットを追加してください。
- django-admin 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
アダプターを使用するようにエンジンを変更します。 NAME
には、データベースの名前(この例ではmyproject
)を使用します。 また、ログイン資格情報を追加する必要があります。 接続するには、ユーザー名、パスワード、およびホストが必要です。 デフォルトが選択されるように、ポートオプションを追加して空白のままにします。
. . .
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
. . .
ここにいる間、ALLOWED_HOSTS
ディレクティブも調整する必要があります。 これは、Djangoインスタンスへの接続を許可されるアドレスまたはドメイン名のホワイトリストを定義します。 このリストにないHostヘッダーを持つ着信要求は、例外を発生させます。 Djangoでは、特定のクラスのセキュリティの脆弱性を防ぐためにこれを設定する必要があります。
以下のスニペットには、デモンストレーションに使用されるコメントアウトされた例がいくつかあります。
. . .
# 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']
角かっこ内に、Djangoサーバーに関連付けられているIPアドレスまたはドメイン名をリストします。 各項目は、エントリをコンマで区切って引用符で囲む必要があります。 ドメイン全体とサブドメインのリクエストを希望する場合は、エントリの先頭にピリオドを追加します。
終了したら、ファイルを保存して閉じます。
データベースを移行してプロジェクトをテストする
Django設定が構成されたので、データ構造をデータベースに移行してサーバーをテストできます。
まず、データベースへの移行を作成して適用することから始めます。 実際のデータはまだないので、これにより初期データベース構造が設定されます。
- cd ~/myproject
- python manage.py makemigrations
- python manage.py migrate
データベース構造を作成した後、次のように入力して管理者アカウントを作成できます。
- python manage.py createsuperuser
ユーザー名を選択し、メールアドレスを入力し、アカウントのパスワードを選択して確認するように求められます。
サーバーの初期設定ガイドに従った場合は、UFWファイアウォールを設置する必要があります。 Django開発サーバーにアクセスしてデータベースをテストする前に、ファイアウォールでポートを開く必要があります。
次のように入力して、ポートへの外部接続を許可します。
- sudo ufw allow 8000
ポートを開いたら、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は開発中および軽生産での使用中に負荷を簡単に処理できますが、ほとんどのプロジェクトは、よりフル機能のデータベース管理システムを実装することで恩恵を受けます。
プロジェクトをさらに進めるには、 Ubuntu 20.04 でPostgres、Nginx、およびGunicornを使用してDjangoをセットアップする方法に関するガイドを参照してください。