🚀
【Django】1行のコマンドでSuperUserを作成できるようにしてみる
Django の SuperUser を下記コマンドで作成しますよね
python manage.py createsuperuser
username,email,password をターミナルと対話して入力していきます
Docker を使用していて、イメージと一緒に superuser を作りたいのですが、 対話式というのがめんどう。。
Dockerfile で superuser が作れないので、イメージ作成した後に自分で作成しなきゃなんですよね
そこで、superuser を作成するコマンドをカスタマイズして、(対話なしの)1行のコマンドで作成されるようにしていきます
ゴール
username,email,password をコマンドのオプションで受け取れるようにし、コマンドのみで superuser を作成できるようにします
// 実装前
python manage.py createsuperuser
// 実装後
python manage.py custom_createsuperuser --username admin --password 123456 --email 'admin@admin.com'
カスタマイズしてみる
- management/commands/ とフォルダを作成していく
- 1. のフォルダ直下に custom_createsuperuser.py を作成する
で実装していきます
(実装後、ディレクトリ例)
sampleapp
├── app
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── management //追加
│ │ ├── __init__.py //追加
│ │ └── commands //追加
│ │ ├── __init__.py //追加
│ │ └── custom_createsuperuser.py //追加
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── db.sqlite3
├── manage.py
└── sampleapp
management/commands/ とフォルダを作成
アプリのフォルダ配下に management フォルダを作成し、その下に commands フォルダを作成していきます
また、作成したフォルダには必ず__init__.py を作成しましょう ※ないと、コマンドとして認識されないみたい??
1. のフォルダ直下に custom_createsuperuser.py を作成
先ほど作成したフォルダ配下に custom_createsuperuser.py を作成し、下記のコードをコピペします (こちらのサイトから引用しました)
# カスタマイズ元のcreatesuperuserをインポート
from django.contrib.auth.management.commands import createsuperuser
# 引数エラー時に使用するエラー
from django.core.management import CommandError
class Command(createsuperuser.Command):
# --helpもしくは-hでヘルプを呼び出したときに表示される文言
help = "Create a superuser with a password non-interactively"
# --password という引数を追加
# usernameやemailはcreatesuperuserにデフォルトであるため、追加不要
def add_arguments(self, parser):
super(Command, self).add_arguments(parser)
parser.add_argument(
"--password",
dest="password",
default=None,
help="Specifies the password for the superuser.",
)
# コマンドのメインの処理
def handle(self, *args, **options):
# 引数の値を取得
options.setdefault("interactive", False)
username = options.get("username")
email = options.get("email")
password = options.get("password")
database = options.get("database")
# username,email,passwordが指定されていない場合
# エラーを出す
if not (username and email and password):
raise CommandError(
"--username, --email and --password are required options"
)
# 引数から受け取った値を格納
user_data = {
"username": username,
"email": email,
"password": password,
}
# usernameをもとにDBに存在しているか確認
exists = (
self.UserModel._default_manager.db_manager(database)
.filter(username=username)
.exists()
)
# 存在していなければ、superuserを作成
if not exists:
self.UserModel._default_manager.db_manager(
database
).create_superuser(**user_data)
動作確認
では、コマンドを実行していきましょう
↓ でID/PW が admin/admin のユーザが作成されました
// 実行するコマンド
python manage.py custom_createsuperuser --username admin --password admin --email 'admin@admin.com'
python manage.py runserver
でサーバーを起動し、管理画面からアクセスしてみましょう
Username : admin
Password : admin
でログイン出来たら OK です。
参考記事
Discussion