Ubuntu 22.04でのDjangoアプリケーションとPostgreSQLの使用方法
導入
Djangoは迅速にPythonアプリケーションを作成するための柔軟なフレームワークです。デフォルトでは、Djangoアプリケーションは軽量なSQLiteデータベースファイルにデータを保存するように構成されています。これは一部の負荷の下ではうまく機能しますが、本番環境ではより伝統的なデータベース管理システムを使用することでパフォーマンスを向上させることができます。
このガイドでは、Djangoアプリケーションと一緒にPostgreSQL(通常はPostgresと呼ばれる)をインストールして設定します。また、いくつかのソフトウェアパッケージをインストールし、アプリケーション用のデータベース認証情報を作成し、このバックエンドで新しいDjangoプロジェクトを開始して設定します。
前提条件
始めるためには、sudo権限が設定された非ルートユーザーを持つUbuntu 22.04サーバーが必要です。この初期サーバー設定ガイドに従って、それをセットアップする方法を学んでください。
続行する準備ができたら、sudoユーザーとしてログインしてください。
ステップ1 – Ubuntuリポジトリからコンポーネントをインストールする
最初に、aptを使ってパッケージマネージャのキャッシュを更新してください。
- sudo apt update
次に、Djangoプロジェクトに必要なコンポーネントをインストールします。これには、Pythonパッケージマネージャであるpipも含まれており、Pythonコンポーネントのインストールと管理を行います。さらに、プロジェクトをサポートするためにPostgresと追加のライブラリもインストールしてください。
- sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib
Python、Postgres、その他のライブラリをインストールした後、データベースの作成に進むことができます。
ステップ2 – データベースとデータベースユーザーの作成
デフォルトでは、Postgresはローカル接続の認証方式としてピア認証と呼ばれる方式を使用しています。つまり、ユーザーのオペレーティングシステムのユーザー名が有効なPostgresのユーザー名と一致する場合、追加の認証なしでそのユーザーがログインできるということです。
Postgresのインストール中に、postgresという名前のオペレーティングシステムユーザーが作成され、postgres PostgreSQL管理ユーザーに対応します。管理タスクを実行するためには、このユーザーpostgresを使用する必要があります。ユーザーであるrootの代わりに、ユーザー名postgresをsudoとともに-uオプションとして渡してコマンドを実行します。以下のコマンドを書き込むことで、対話型のPostgresセッションにログインします。
- sudo -u postgres psql
現在、postgresユーザーのシェルセッションにアクセスできます。
次に、Djangoプロジェクトのためのデータベースを作成してください。セキュリティ上の理由から、それぞれのプロジェクトには独自の隔離されたデータベースが必要です。このガイドでは、データベースの名前をmyprojectとしていますが、より具体的な名前を付けることが良い習慣です。さらに、Postgresコマンドを入力する際には、SQLプロンプトでコマンドをセミコロン(;)で終了することを忘れないでください。
- CREATE DATABASE myproject;
今、データベースに接続して操作するためのデータベースユーザーを作成してください。パスワードは強力かつ安全なものに設定してください。
- CREATE USER myproject_user WITH PASSWORD ‘myproject_database_password‘;
その後、作成したユーザーのいくつかの接続パラメータを変更します。これにより、接続が確立されるたびにクエリを行って値を設定する必要がなくなり、データベースの操作がスピーディになります。まず、デフォルトのエンコーディングをUTF-8に設定してください。
- ALTER ROLE myproject_user SET client_encoding TO ‘utf8’;
その後、デフォルトのトランザクション分離スキームを読み込まれたコミットに設定し、未コミットのトランザクションからの読み込みをブロックします。
- ALTER ROLE myproject_user SET default_transaction_isolation TO ‘read committed’;
最後に、タイムゾーンを設定してください。デフォルトでは、DjangoプロジェクトはUTCを使用するように設定されています。これはDjangoプロジェクトからの推奨です。
- ALTER ROLE myproject_user SET timezone TO ‘UTC’;
今、作成したデータベースにデータベースユーザーにアクセス権を付与してください。
- GRANT ALL PRIVILEGES ON DATABASE myproject TO myproject_user;
SQLプロンプトを終了し、Postgresユーザーのシェルセッションに戻ります。
- \q
データベースの設定が完了したので、Djangoをインストールすることができます。
ステップ3-仮想環境内にDjangoをインストールします。
より柔軟性を高めるために、Pythonの仮想環境内にDjangoとその依存パッケージをインストールしてください。
以下のコマンドを入力して環境を作成することができるvirtualenvパッケージが入手可能です。
- sudo pip 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パッケージもインストールします。
- pip install Django psycopg2
Note
あなたは今、myprojectディレクトリ内でDjangoプロジェクトを開始することができます。これにより、同じ名前の子ディレクトリがコードを保持するために作成され、現在のディレクトリ内に管理スクリプトが作成されます。これを正しく設定するために、コマンドの末尾にドット.を含めるようにしてください。
- django-admin startproject myproject .
Djangoと仮想環境が設定されたら、次はDjangoのデータベース設定を行うことができます。
ステップ4 – Djangoのデータベース設定の構成
あなたがプロジェクトを持っている今、作成したデータベースを使用するように設定する必要があります。
お好きなテキストエディタを使用して、子プロジェクトディレクトリ内にあるメインのDjangoプロジェクト設定ファイルを開いてください。この例では、nanoを使用しています。
- nano ~/myproject/myproject/settings.py
ファイルの最下部には、SQLiteを使用するように現在設定されているDATABASESセクションがあります。
. . .
# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
. . .
Postgresを使用するように変更する必要があります。
最初に、sqlite3バックエンドの代わりにpostgresqlアダプターを使用するようにエンジンを変更してください。NAMEには、データベースの名前を使用してください。この例では、myprojectがデータベースの名前です。次に、ユーザー名、パスワード、接続するホストを含むログイン認証情報を追加してください。最後に、ポートオプションを空白にしてデフォルトを選択します。
~/myproject/myproject/settings.py私のプロジェクトの設定は、~/myproject/myproject/settings.pyです。
. . .
# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myproject',
'USER': 'myproject_user',
'PASSWORD': 'myproject_database_password',
'HOST': 'localhost',
'PORT': '',
}
}
. . .
また、ALLOWED_HOSTSディレクティブを調整する必要もあります。これは、Djangoインスタンスに接続を許可するアドレスやドメイン名のホワイトリストを定義します。このリストに含まれていないHostヘッダーを持つ受信リクエストは例外を発生させます。Djangoは、特定のセキュリティ脆弱性を防ぐためにこの設定を行う必要があります。
以下は、Djangoサーバーに関連付けられているIPアドレスまたはドメイン名を角括弧内にリストしてください。各項目は引用符で囲まれ、エントリーはカンマで区切られている必要があります。特定のドメインとそのサブドメイン全体をリクエストする場合は、エントリーの先頭にピリオドを追加してください。
以下のように、Djangoサーバーのドメイン名とIPアドレスを追加することができます: ALLOWED_HOSTS = [‘your_domain’, ‘203.0.113.5’]。もしyour_domainとそのサブドメインに応答したい場合は、ドット(.)でドメインを開始してください: ALLOWED_HOSTS = [‘.your_domain’, ‘203.0.113.5’]。
例えば、サーバーのドメインまたはIPアドレスを入力してください。
以下の文を日本語で自然な言い方に言い換えます。
「~/myproject/myproject/settings.py」
. . .
ALLOWED_HOSTS = ['your_server_domain_or_IP']
. . .
作業が終了したら、ファイルを保存して閉じてください。もしnanoを使用している場合は、CTRL+X、y、Enterの順に押してください。
ステップ5 – データベースの移行とプロジェクトのテスト
Djangoの設定が完了したので、データ構造をデータベースにマイグレーションし、サーバーをテストすることができます。
最初に、データベースにマイグレーションを作成して適用します。まだデータがないので、これにより初期のデータベース構造が設定されます。まず、myprojectディレクトリにいることを確認してください。
- cd ~/myproject
それから移行を作成して適用してください。
- python manage.py makemigrations
- python manage.py migrate
データベースの構造を作成した後、以下の情報を入力して管理アカウントを作成してください。
- python manage.py createsuperuser
ユーザー名を選択するように求められます。サーバーに関連付けられたユーザー名を使用する場合は、この欄を空白のままにすることができます。その後、メールアドレスを提供し、アカウントのパスワードを作成してください。
Djangoの開発サーバーにアクセスする前に、データベースへの接続をテストしてください。外部からの接続を許可するために、ファイアウォールでポートを開放してください。
- sudo ufw allow 8000
ポートが開いたら、Django開発サーバーを起動して、データベースが正常に動作しているかどうかをテストすることができます。
- python manage.py runserver 0.0.0.0:8000
ウェブブラウザで、サーバーのドメイン名またはIPアドレスにアクセスし、:8000を付けると、デフォルトのDjangoのランディングページに到達します。
http://server_domain_or_IP:8000
URLの末尾に「/admin」を追加すると、管理者インターフェースのログイン画面にアクセスできるはずです。
「createsuperuser」コマンドを使用して作成したユーザー名とパスワードを入力してください。それから、管理者インターフェースに移動します。
You can stop the development server by pressing CTRL+C in your terminal window after you finish exploring.
管理者インターフェースにアクセスすることで、データベースがユーザーアカウント情報を保存しており、適切にアクセスできることを確認しました。
結論
このガイドでは、DjangoプロジェクトのバックエンドデータベースとしてPostgreSQLをインストールおよび設定する方法を学びました。SQLiteは開発および軽量なプロダクション使用中に負荷を処理できますが、ほとんどのプロジェクトはより充実したデータベース管理システムの導入により恩恵を受けます。
プロジェクトをさらに進めるためには、Ubuntu 22.04でDjangoとPostgres、Nginx、Gunicornを設定する方法についてのガイドを読んでください。