delhi09の勉強日記

技術トピック専用のブログです。自分用のメモ書きの投稿が多いです。あくまで「勉強日記」なので記事の内容は鵜呑みにしないでください。

Djangoでcreatesuperuserを自動化したいときに使えるオプション(--noinput)

概要

Djangoでプロジェクトを作成した後に、初期ユーザーを作成する際には

$ python manage.py createsuperuser

を実行する。

このコマンドは、デフォルトでは対話モードで実行されるので、自動化してスクリプトの中で実行したいときに面倒である。

私自身も、以前にDocker起動時にcreatesuperuserを実行してユーザーを作成したいことがあって、その際はcreatesuperuserを対話モードで実行する方法しか知らなかったので、expectコマンドで強引に作成していた。(できないことはなかった。)

kamatimaru.hatenablog.com

先日、公式ドキュメントに載っているやり方で、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を非対話モードで(=宣言的に)実行することができる。

docs.djangoproject.com

ただ、--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.