pythonのWebフレームワーク、Djangoにチャレンジ!–その3:管理者権限の作成とその自動化–
この度は、株式会社ウェブネーションをご訪問頂き、誠にありがとうございます。
今回は、巷で人気のプログラミング言語python、その中のWebフレームワーク、djangoを使ってWeb開発にチャレンジしてみましたので、その手順の一部を紹介いたします。
しかしながら、内容の規模が少々大きく見込まれるため、いくつかパートに分けて紹介いたします。今回は管理者権限の作成とその自動化です。
最後までお読みいただけますと幸いです。
目次
前提条件
- Windowsではコマンドプロンプトが、Macではターミナルが起動できていること
- 下記2点の言語/ツールがインストールされていること
- python
- pip ← pythonのパッケージ管理ツール
- Djangoの仮想環境構築やパッケージ管理ができる環境になっていること
- Docker Desktopがインストールされており、かつこのツールで環境構築ができるようになっていること
- Docker経由で、データベースのマイグレーションが自動でできるようになっていること
- 下記のディレクトリ構成になっていること
boards
├── .env
├── Dockerfile
├── Pipfile
├── Pipfile.lock
├── boards
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── config
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── docker-compose.yml
├── manage.py
└── requirements.txt
DockerでDjangoの管理者権限を作成
Djangoには、下記のように、管理画面を使ってコンテンツを管理する機能(“content administration”)が備わっています。そのため、管理画面を一から作る必要はありません。
Fully loaded.
Django includes dozens of extras you can use to handle common web development tasks. Django takes care of user authentication, content administration, site maps, RSS feeds, and many more tasks — right out of the box.
Django overview | Django
しかしながら、Djangoの管理画面を使用するには、管理者権限を作成する必要があります。そこで今回は、Docker経由でDjangoの管理者権限を作成しようと思います。
コマンドプロンプト/ターミナル(dockerコンテナ削除&ビルド&起動)
まず、その2で用意した2点のコンテナ、boards-appとboards-dbを下記コマンドで削除&ビルド&起動します。
# -vオプションを適用すれば、現在確保されているコンテナboards-db内のDockerVolumeである、DBのデータも削除してくれる。
docker-compose down -v
# -dオプションを適用しない場合、コマンドプロンプト/ターミナルにDockerのログが出力される。
docker-compose up -d --build
Docker Desktopでの操作
Docker Desktopにて、先ほど用意したコンテナ2点のサーバの起動がいずれも確認できたら、今度はコンテナboards-appをクリックします。
※今回は「boards-app」を操作します。その2で操作したコンテナは「boards-db」ですので、この点見間違いにご注意ください。
下の画像が確認できたら、今度は「Exec」と書かれたタブをクリックします。
Dockerコンテナ上のターミナル
「#」が出力されたら、コマンド「python manage.py createsuperuser」を入力して実行します。
下記コード最下部にある、「Superuser created successfully.」の出力が確認できたら、管理者権限の作成は完了です。
$ python manage.py createsuperuser
ユーザー名 (leave blank to use 'root'): [管理者権限のユーザー名]
メールアドレス: [管理者権限のメールアドレス]
# パスワードについて、開発環境では8文字以下でも問題ありませんが、本番環境では8文字以上長めでかつ複雑な組合せにすることを強くお勧めします。
Password:
Password (again):
このパスワードは短すぎます。最低 8 文字以上必要です。
このパスワードは一般的すぎます。
このパスワードは数字しか使われていません。
# ↓これは、「パスワードが短すぎる、もしくは単純な組み合わせだが、無視して大丈夫か」を問うている。開発環境では「y」で問題ない。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
ブラウザでの操作
続いて、管理者権限が作成できているかどうかを、ブラウザを使って確認します。
まず「localhost:8000/admin」をブラウザのURLに入力してEnterキーを押下します。
そうすると、下の画像のような画面が表示されますので、ここに先ほど入力したユーザー名とパスワードを入力し、「ログイン」ボタンかEnterキーを押下します。
下の画像のような画面が表示できたら、管理者権限が正常に作成したことになります。
DockerでのDjangoの管理者権限の作成を自動化
上記の環境において、やむをえずDockerボリュームを削除するケースが多くなると、管理者権限を何度も手動で作成する必要がやはり出てしまいます。
ですが、この作業を自動化すれば、たとえDockerボリュームを削除するケースが多くとも、管理者権限を自動で作成できるようになります。
※Dockerボリュームの削除は、コマンド「docker-compose down -v」の実行で行われています。
今回はその方法もご紹介いたします。なお、下記3点の記事を参考にしました。
- 【Django】ワンライナーでスーパーユーザーを作成する方法(2023年12月23日閲覧)
- 素人基盤エンジニアがDockerでDjangoを触るシリーズ③:Django admin #Python – Qiita(2023年12月23日閲覧)
- How to create custom django-admin commands | Django documentation | Django(2023年12月23日閲覧)
まずは、環境変数とそれらを用いたコマンドを確保します。
.env
...
POSTGRES_PASSWORD=...
# ----------- 変更箇所(始) ------------
# 管理者権限のパスワードにつきまして、開発環境は適当な文字列で差し支えありませんが、仮に本番環境で使用する場合、セキュリティ対策の観点から、ランダムかつ長い文字列を必ずお使いください。
ADMIN_USER=[管理者権限のユーザー名]
ADMIN_EMAIL=[管理者権限のメールアドレス]
ADMIN_PASSWORD=[管理者権限のパスワード]
# ----------- 変更箇所(終) ------------
docker-compose.yml
...
services:
boards-app:
...
command: >
sh -c "sleep 5 &&
python manage.py makemigrations &&
python manage.py migrate &&
# ----------- 変更箇所(始) ------------
python manage.py createsuperuser &&
python manage.py createcustomsuperuser --username
${ADMIN_USER} --password ${ADMIN_PASSWORD} --email ${ADMIN_EMAIL} --noinput &&
# ----------- 変更箇所(終) ------------
python manage.py runserver 0.0.0.0:8000"
...
続いて、Djangoの管理者権限自動作成コマンドを動かすためのコードを作成します。
コマンドプロンプト / ターミナル
# カレントディレクトリ(現在のディレクトリ): boards/boards
# managementフォルダ生成
mkdir management
cd management
touch __init__.py
# commandsフォルダ生成と、管理者権限自動作成コマンドを含んだpythonファイル(createcustomsuperuser.py)の確保
mkdir commands
cd commands
touch __init__.py
touch createcustomsuperuser.py
createcustomsuperuser.py
from typing import Any
# createsuperuserのコマンドを拡張
from django.contrib.auth.management.commands import createsuperuser
# djangoのコマンドエラー
from django.core.management import CommandError
class Command(createsuperuser.Command):
# --help or -h でヘルプを呼び出したときの文字列
help = '管理者権限のユーザ名とパスワードを入力してください。'
# コマンドの引数を追加
def add_arguments(self, parser) -> None:
super().add_arguments(parser)
parser.add_argument(
'--password', dest='password', default=None,
help='パスワードを設定してください。',
)
# 実際に処理を実行
def handle(self, *args: Any, **options: Any) -> str | None:
password = options.get('password')
username = options.get('username')
database = options.get('database')
if password and not username :
raise CommandError('ユーザ名を入力してください。')
super().handle(*args, **options)
if password:
user = self.UserModel._default_manager.db_manager(database).get(username=username)
user.set_password(password)
user.save()
この状態で、先ほど触れた見出し「DockerでDjangoの管理者権限を作成」のうち、下記2点の操作を行った後、ログインができたら、管理者権限の作成自動化は完了です。
なお、この時点でのディレクトリは下記の状態になると思います。
boards
├── .env
├── Dockerfile
├── Pipfile
├── Pipfile.lock
├── boards
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── management
│ │ ├── __init__.py
│ │ └── commands
│ │ ├── __init__.py
│ │ └── createcustomsuperuser.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── config
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── docker-compose.yml
├── manage.py
└── requirements.txt
最後に
いかがでしたでしょうか?
管理者権限の作成を自動化すれば、毎回手動で作成する必要がなくなりますので、こちらもまた開発効率の向上が期待できる方法だと考えます。
次回は、Djangoで自作のWebページを作る方法ついて紹介いたします。
今回はここまでとさせていただきます。
最後までお読みいただき、誠にありがとうございます。