djangoでcreatesuperuserを自動化する方法は?


127

自動で実行manage.py createsuperuserしたいのですがdjango、デフォルトのパスワードを設定する方法がないようです。

どうすれば入手できますか?djangoデータベースから独立している必要があります。


1
作成したスーパーユーザーにフィクスチャを保存し、manage.pyを使用してそれをロードすることを検討しましたか?
turbotux 2017

1
@turbotux Hendrik Fの回答は、env vars(またはファイルシステムなど)から値(ログイン、パスワード...)を読み取る機能が追加され、提案されたものと同様のアプローチを取ります。アプリケーションを再起動すると問題が発生するアドホックpythonスクリプトの代わりに、この方向に進むことを強くお勧めします。
Ad N

回答:


144

Userを直接参照すると、AUTH_USER_MODEL設定が別のユーザーモデルに変更されているプロジェクトでは、コードは機能しません。ユーザーを作成するより一般的な方法は次のとおりです。

echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'admin@myproject.com', 'password')" | python manage.py shell

元の回答

ここに、スーパーユーザーを作成するスクリプトの簡単なバージョンがあります。

echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'pass')" | python manage.py shell

2
herokuでスーパーユーザーを作成し、ネットワークがポート5000をブロックする場合に非常に便利
Vic

4
私は既存のスーパーユーザを削除しますので、これはすべてのビルドのために有効である: echo "from django.contrib.auth.models import User; User.objects.filter(email='admin@example.com').delete(); User.objects.create_superuser('admin@example.com', 'admin', 'nimda')" | python manage.py shell
とMontaro

12
個人的には、ビルドごとにユーザーを削除することは良い考えではないと思います。カスケード削除を使用して、関連するレコードを誤って削除するリスクがあります。より安全なオプションは、ユーザーが既に存在する場合は、単に救済する(または既存のユーザーレコードを更新する)ことです。
ウィル

6
少なくともDjango 1.11では。引数の順序は( 'username'、 'email'、 'pass')であり、( 'email'、 'username'、 'pass')ではありません。参照:docs.djangoproject.com/en/1.11/ref/contrib/auth/...
NP8

3
from django.contrib.auth.models import User動作しなくなりました。これを使用: from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'admin@myproject.com', 'my secure password')
dcalde

48

私自身もこれに対する答えを探していました。ベースを拡張するDjangoコマンドを作成することにしましたcreatesuperuserコマンド(GitHub)。

from django.contrib.auth.management.commands import createsuperuser
from django.core.management import CommandError


class Command(createsuperuser.Command):
    help = 'Crate a superuser, and allow password to be provided'

    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):
        password = options.get('password')
        username = options.get('username')
        database = options.get('database')

        if password and not username:
            raise CommandError("--username is required if specifying --password")

        super(Command, self).handle(*args, **options)

        if password:
            user = self.UserModel._default_manager.db_manager(database).get(username=username)
            user.set_password(password)
            user.save()

使用例:

./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'

これには、デフォルトのコマンドの使用をサポートしながら、パスワードを指定するための非対話的な使用も可能にするという利点があります。


4
これは、最も支持された(そして受け入れられた)回答であるはずです。
Bruno desthuilliers

私は、デフォルトが望むcreatesuperuserこの持っていた--password、あまりにもフィールドを
シャディ・

1
使用例を追加できます:./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'
shadi

2
createsuperuser2このクラス、関数にどのようにマッピングされるか
Srinath Ganesh

2
@SrinathGaneshは、docs.djangoproject.com / en / 1.8 / howto / custom-management-commandsを参照してください。Python ファイルに名前を付け、createsuperuser2.py上記のリンクから定義済みのディレクトリ構造に配置する必要があります。
ElectRocnic

43

「./manage.py shell -c」を使用します。

./manage.py shell -c "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'adminpass')"

これは余分なエコーを使用しません。これには、実行のためにDockerコンテナーに渡すことができるという利点があります。sh -c "..."を使用する必要なし地獄をエスケープする引用符が付きます。

そして、最初に来るのはメールではなくユーザー名であることを思い出してください。

カスタムユーザーモデルがある場合は、それをインポートする必要があります。 auth.models.User


1
私のために働いた。ありがとう!
TimH-Codidact 2018年

私のための仕事には表示されません、私が見ている:AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
Brodan

users.User インポートする必要がないようなカスタムユーザーモデルがある場合auth.User
yvess

29

データ移行を実行することをお勧めします。そのため、移行がプロジェクトに適用されると、移行の一部としてスーパーユーザーが作成されます。ユーザー名とパスワードは、環境変数として設定できます。これは、コンテナーでアプリを実行するときにも役立ちます(例としてこのスレッドを参照)

データの移行は次のようになります。

import os
from django.db import migrations

class Migration(migrations.Migration):
    dependencies = [
        ('<your_app>', '<previous_migration>'),
    ] # can also be emtpy if it's your first migration

    def generate_superuser(apps, schema_editor):
        from django.contrib.auth.models import User

        DJANGO_DB_NAME = os.environ.get('DJANGO_DB_NAME', "default")
        DJANGO_SU_NAME = os.environ.get('DJANGO_SU_NAME')
        DJANGO_SU_EMAIL = os.environ.get('DJANGO_SU_EMAIL')
        DJANGO_SU_PASSWORD = os.environ.get('DJANGO_SU_PASSWORD')

        superuser = User.objects.create_superuser(
            username=DJANGO_SU_NAME,
            email=DJANGO_SU_EMAIL,
            password=DJANGO_SU_PASSWORD)

        superuser.save()

    operations = [
        migrations.RunPython(generate_superuser),
    ]

お役に立てば幸いです。

編集:一部の人は、これらの環境変数を設定してDjangoにそれらを認識させる方法について疑問を投げかけるかもしれません。さまざまな方法があり、他のSOの投稿で回答されてい.envますが、簡単な指針として、ファイルを作成することをお勧めします。その後、python-dotenvパッケージを使用できますが、pipenvを使用して仮想環境をセットアップした場合は、.envファイルにenvvarsが自動的に設定されます。同様に、docker-composeを介してアプリを実行すると、.envファイルを読み取ることができます。


1
ヒント:このアプローチを検討してください。これは高品質の回答です。アドホックなpythonスクリプトをエコーする代わりに、Djangoの組み込み機能を自然に利用して質問に答えます。さらに、受け入れられた回答の最大の問題に自然に対処します(移行はデプロイで一度だけ適用されます) 、ユーザーは一度だけ作成されます)。コンテナのコンテキストで美しく機能します。
Ad N

これは素晴らしい答えのようです。このコード部分がプロジェクトのどこに収まるのかまだわかりませんか?
Pablo Ruiz Ruiz

移行フォルダにある必要があります。たとえばroot/⁨mysite⁩/myapp⁩/⁨migrations⁩、ドキュメントを読んだ場合、空の移行を作成して変更する方法が説明されていますpython manage.py makemigrations --empty yourappname
Hendrik F

なぜDJANGO_DB_NAMEが必要なのですか?使用されることはありません。
thoroc

あなたは.envはにvarsのロードに以下を追加するために言及する必要がありsettings.pyます。ファイルpython # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
thoroc

21

ジャンゴ3.0の時点で、あなたはデフォルトに使用できるcreatesuperuser --noinputコマンドを環境変数として(パスワードを含む)すべての必須フィールドを設定しDJANGO_SUPERUSER_PASSWORDDJANGO_SUPERUSER_USERNAMEDJANGO_SUPERUSER_EMAIL例えば。--noinputフラグが必要です。

これは元のドキュメントから来ています: https //docs.djangoproject.com/en/3.0/ref/django-admin/#django-admin-createsuperuser

と私はちょうどチェックした-それは動作します。これで、これらの環境変数を簡単にエクスポートcreatesuperuserして、スクリプトとパイプラインに追加できます。


14

スーパーユーザー作成の自動化を処理する簡単なpythonスクリプトを書くことができます。UserスタンドアロンDjangoのスクリプトを書くの通常のプロセスに従うと思いますので、このモデルは、普通のDjangoのモデルです。例:

import django
django.setup()

from django.contrib.auth.models import User

u = User(username='unique_fellow')
u.set_password('a_very_cryptic_password')
u.is_superuser = True
u.is_staff = True
u.save()

またcreatesuperuser、いくつかのオプションを渡すこともできます。つまり--noinput、および--usernameを使用すると、新しいスーパーユーザーを自動的に作成できますが、パスワードを設定するまでログインできません。


2
[OK]をするためにcretesuperuser、どのように、パスワードを設定するには?bashスクリプト内でそれを実行したいと思います...
caneta

10

現在最も投票されている回答:

  • ユーザーが存在する場合、ユーザーを削除します。コメントの@Groadyに示されているように、カスケード削除によって関連レコードが誤って削除されるリスクがあります。
  • メールによるスーパーユーザーの存在フィルタリングをチェックして、2人のスーパーユーザーが同じメールを持っている場合は、どれを削除するかを確認します。
  • ユーザー名、パスワード、メールなどのスクリプトパラメータを更新するのは面倒です。
  • 何をしたかを記録しません。

改善されたバージョンは次のようになります:

USER="admin"
PASS="super_password"
MAIL="admin@mail.com"
script="
from django.contrib.auth.models import User;

username = '$USER';
password = '$PASS';
email = '$MAIL';

if User.objects.filter(username=username).count()==0:
    User.objects.create_superuser(username, email, password);
    print('Superuser created.');
else:
    print('Superuser creation skipped.');
"
printf "$script" | python manage.py shell

2
受け入れられた回答よりもはるかにクリーン(良い)です。次も使用できます:if not User.objects.filter(username = username).exists()
Philippe Fanaro

5
DJANGO_SUPERUSER_USERNAME=testuser \
DJANGO_SUPERUSER_PASSWORD=testpass \
python manage.py createsuperuser --noinput

createuserコマンドのドキュメント


これが最も簡単な解決策です。しかし、あなたは上書きすることができますnoinput:他のparamsで旗をDJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email admin@email.com --noinput
dannydedog

1

Tk421の1つのライナーを使用しましたが、次のようなエラーメッセージが表示されました。1)DjangoのManager isn't available; 'auth.User' has been swapped for 'users.User'新しいバージョン(1.10)を使用していると思います。

だから私はそれを次のように置き換えました:

echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(email='admin@example.com', is_superuser=True).delete(); User.objects.create_superuser('admin', 'admin@example.com', 'nimda')" | python manage.py shell

そして、私が本当に満足しているのは、これがherokuデプロイメントでも機能することです。

heroku run echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(email='admin@example.com', is_superuser=True).delete(); User.objects.create_superuser('admin', 'admin@example.com', 'nimda')" | python manage.py shell

これは繰り返しうまく機能します。私はそれをプロジェクトの最初に使用しているので、後で発生する可能性がある恐ろしいカスケード削除について心配する必要はありません。

ファブリックからlocal()の内部でこれを実行する際に問題が発生した後、私は再訪しました。起こっているように見えたのは、パイプ記号がherokuではなくローカルで解釈されていたことを意味するということです。これを並べ替えるには、コマンドを引用符で囲みました。次に、pythonコマンド全体の単一引用符内のpython文字列に三重二重引用符を使用する必要がありました。

heroku run "echo 'from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(email="""admin@example.com""", is_superuser=True).delete(); User.objects.create_superuser("""admin""", """admin@example.com""", """nimda""")' | python manage.py shell"

1

溶液に基づくアダムチャーノックのアプローチ以上が今ではPythonパッケージとして入手可能です。3つのステップが必要です。

  1. インストール: pip install django-createsuperuserwithpassword

  2. アクティベート: INSTALLED_APPS += ("django_createsuperuserwithpassword", )

  3. 適用:

    python manage.py createsuperuserwithpassword \
            --username admin \
            --password admin \
            --email admin@example.org \
            --preserve

それでおしまい。



0

この小さなpythonスクリプトは、通常のユーザーまたはスーパーユーザーを作成できます

#!/usr/bin/env python

import os
import sys
import argparse
import random
import string
import django


def main(arguments):

    parser = argparse.ArgumentParser()
    parser.add_argument('--username', dest='username', type=str)
    parser.add_argument('--email', dest='email', type=str)
    parser.add_argument('--settings', dest='settings', type=str)
    parser.add_argument('--project_dir', dest='project_dir', type=str)
    parser.add_argument('--password', dest='password', type=str, required=False)
    parser.add_argument('--superuser', dest='superuser', action='store_true', required=False)

    args = parser.parse_args()

    sys.path.append(args.project_dir)
    os.environ['DJANGO_SETTINGS_MODULE'] = args.settings
    from django.contrib.auth.models import User
    django.setup()

    username = args.username
    email = args.email
    password = ''.join(random.sample(string.letters, 20)) if args.password is None else args.password
    superuser = args.superuser 

    try:
        user_obj = User.objects.get(username=args.username)
        user_obj.set_password(password)
        user_obj.save()
    except User.DoesNotExist:
    if superuser:
            User.objects.create_superuser(username, email, password)
    else:
        User.objects.create_user(username, email, password)

    print password


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))

--superuserと--passwordは必須ではありません。

--superuserが定義されていない場合、通常のユーザーが作成されます--passwordが定義されていない場合、ランダムなパスワードが生成されます

    Ex : 
        /var/www/vhosts/PROJECT/python27/bin/python /usr/local/sbin/manage_dja_superusertest.py --username USERNAME --email TEST@domain.tld --project_dir /var/www/vhosts/PROJECT/PROJECT/ --settings PROJECT.settings.env 

0

これは、私がHeroku post_deployと事前定義されたapp.json変数についてまとめたものです。

if [[ -n "$CREATE_SUPER_USER" ]]; then
    echo "==> Creating super user"
    cd /app/example_project/src
    printf "from django.contrib.auth.models import User\nif not User.objects.exists(): User.objects.create_superuser(*'$CREATE_SUPER_USER'.split(':'))" | python /app/example_project/manage.py shell
fi

これにより、単一の環境変数を持つことができます:

CREATE_SUPER_USER=admin:admin@example.com:password

シェルの--commandオプションは好きですが、コマンドスクリプトで改行文字を取得する方法がわかりません。改行がないと、if式は構文エラーになります。


0

コマンドプロンプトに移動し、次のように入力します。

C:\WINDOWS\system32>pip install django-createsuperuser
Collecting django-createsuperuser
  Downloading https://files.pythonhosted.org/packages/93/8c/344c6367afa62b709adebee039d09229675f1ee34d424180fcee9ed857a5/django-createsuperuser-2019.4.13.tar.gz
Requirement already satisfied: Django>1.0 in c:\programdata\anaconda3\lib\site-packages (from django-createsuperuser) (2.2.1)
Requirement already satisfied: setuptools in c:\programdata\anaconda3\lib\site-packages (from django-createsuperuser) (41.0.1)
Requirement already satisfied: sqlparse in c:\programdata\anaconda3\lib\site-packages (from Django>1.0->django-createsuperuser) (0.3.0)
Requirement already satisfied: pytz in c:\programdata\anaconda3\lib\site-packages (from Django>1.0->django-createsuperuser) (2018.7)
Building wheels for collected packages: django-createsuperuser
  Running setup.py bdist_wheel for django-createsuperuser ... done
  Stored in directory: C:\Users\Arif Khan\AppData\Local\pip\Cache\wheels\0c\96\2a\e73e95bd420e844d3da1c9d3e496c92642a4f2181535440db2
Successfully built django-createsuperuser
Installing collected packages: django-createsuperuser

移行が実行されない場合は、djangoアプリケーションフォルダーに移動し、以下を実行します

  1. python manage.py migrate
  2. python manage.py createsuperuser

次にビンゴ。


0
python manage.py shell -c "from django.contrib.auth.models import User; \
                           User.objects.filter(username='admin1').exists() or \
                           User.objects.create_superuser('admin1',
                           'admin1@example.com', 'admin1')"

0

shell_plusを使用すると、実際にははるかに簡単です。

echo "User.objects.create_superuser('test@test.com', 'test')" | python manage.py shell_plus

他の人が述べたように、Django 3.0では、環境変数を介して資格情報を渡すことができます。ただし、この方法では、すべてのテストユーザーを削除するなど、他のより複雑なタスクを実行できるため、はるかに柔軟です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.