概要
Djangoでプロジェクトを作成した後に、初期ユーザーを作成する際には
$ python manage.py createsuperuser
を実行する。
このコマンドは、デフォルトでは対話モードで実行されるので、自動化してスクリプトの中で実行したいときに面倒である。
私自身も、以前にDocker起動時にcreatesuperuserを実行してユーザーを作成したいことがあって、その際はcreatesuperuserを対話モードで実行する方法しか知らなかったので、expect
コマンドで強引に作成していた。(できないことはなかった。)
先日、公式ドキュメントに載っているやり方で、createsuperuserを宣言的に実行する方法があることを知ったのでメモ。
結論
前提
Django3.0以降であること
手順
①以下のように環境変数を定義する。
$ export DJANGO_SUPERUSER_USERNAME=admin $ export DJANGO_SUPERUSER_EMAIL=admin@example.com $ export DJANGO_SUPERUSER_PASSWORD=password
②--noinput
オプションをつけてcreatesuperuserを実行する。
$ python manage.py createsuperuser --noinput
これで、
- ユーザー名: admin
- メールアドレス: admin@example.com
- パスワード: password
のユーザーが作成される。
説明
以下の公式ドキュメントに記載があるように、--noinput
というオプションをつけると、createsuperuserを非対話モードで(=宣言的に)実行することができる。
ただ、--noinput
というオプション自体は元からあったようだが、このオプションを使う際には以下のように、--username
と--email
を一緒に指定してユーザーを作成する方法しか、Django3.0より前はなかったようである。
$ python manage.py createsuperuser --noinput --username=admin --email=admin@example.com
この方法では、パスワードは設定できないので、パスワードがemptyのユーザーが作成される。
※ 以下のissueをみると、そういう仕様らしい。
code.djangoproject.com
パスワードがemptyのユーザーでも問題ない用途であればよいのだが、例えばDjango Adminにログインしようとするとバリデーションで弾かれたりするなど、できないこともあるので、パスワードありのユーザーを作成したい場合もあると思う。
Django3.0で、--noinput
をつけてcreatesuperuserを実行した際の各値を、環境変数に設定できるようになったので、パスワードありのユーザーを宣言的に作成できるようになった。
Changed in Django 3.0:
Support for using DJANGO_SUPERUSER_PASSWORD and DJANGO_SUPERUSER_environment variables was added.