Django에서 createsuperuser를 자동화하는 방법은 무엇입니까?


128

자동으로 실행 manage.py createsuperuser하고 django싶지만 기본 비밀번호를 설정할 방법이 없다는 것이 확인되었습니다.

어떻게 얻을 수 있습니까? 장고 데이터베이스에서 독립적이어야합니다.


1
생성 된 수퍼 유저를 조명기에 저장하고 manage.py를 사용하여로드하는 방법을 살펴 보셨습니까?
turbotux

1
@turbotux Hendrik F 답변은 env vars (또는 파일 시스템, ...)에서 값 (로그인, 암호 ...)을 읽는 추가 기능과 함께 제안하는 것과 유사한 접근 방식을 취합니다. 응용 프로그램을 다시 시작할 때 문제가있는 임시 Python 스크립트 대신이 방향을 사용하는 것이 좋습니다.
Ad N

답변:


145

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에서 수퍼 유저를 만들려고 할 때 매우 유용합니다

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

49

나는 이것에 대한 답을 직접 찾고 있었다. 기본 createsuperuser명령 ( GitHub ) 을 확장하는 Django 명령을 만들기로 결정했습니다 .

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 가네

2
한 번 봐 가지고 @SrinathGanesh docs.djangoproject.com/en/1.8/howto/custom-management-commands을 당신은 파이썬 파일의 이름을 지정해야 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')"

이것은 추가 에코를 사용하지 않으며 실행을 위해 도커 컨테이너에 전달할 수 있다는 이점이 있습니다. 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

30

데이터 마이그레이션 실행을 제안 하므로 마이그레이션이 프로젝트에 적용될 때 마이그레이션의 일부로 수퍼 유저가 생성됩니다. 사용자 이름과 암호는 환경 변수로 설정할 수 있습니다. 이는 컨테이너에서 앱을 실행할 때도 유용합니다 ( 이 스레드 를 예제로 참조 ).

데이터 마이그레이션은 다음과 같습니다.

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파일에 envvar를 자동으로 설정 합니다. 마찬가지로 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

23

장고 3.0로서 당신은 기본적으로 사용할 수있는 createsuperuser --noinput명령을 환경 변수로 (비밀번호 포함) 모든 필수 필드를 설정 DJANGO_SUPERUSER_PASSWORD, DJANGO_SUPERUSER_USERNAME, DJANGO_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
좋습니다 cretesuperuser. 그러나 비밀번호를 설정하는 방법은 무엇입니까? 나는 그것을 bash 스크립트 내에서하고 싶습니다 ...
caneta

10

현재 가장 많이 투표 한 답변 :

  • 사용자가 존재하고 @Groady가 ​​주석에서 언급 한대로 계단식 삭제를 통해 의도하지 않게 관련 레코드를 삭제할 위험이있는 사용자를 삭제합니다.
  • 두 수퍼 유저가 동일한 메일을 가지고 있으면 어느 것이 삭제되는지 알 수 있도록 메일로 수퍼 유저 존재 필터링을 확인합니다.
  • 사용자 이름, 비밀번호 및 메일과 같은 스크립트 매개 변수를 업데이트하는 것은 번거 롭습니다.
  • 한 일을 기록하지 않습니다.

개선 된 버전은 다음과 같습니다.

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(),
필립 Fanaro을

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

createuser 명령에 대한 문서


이것이 가장 쉬운 해결책입니다. 그러나 noinput다른 매개 변수로 플래그를 덮어 쓸 수 있습니다 .DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email admin@email.com --noinput
dannydedog

1

Tk421 하나의 라이너를 사용했지만 다음과 같은 오류 메시지가 나타납니다. 1) Django (1.10)의 최신 버전을 사용하고 있다고 생각합니다. Manager isn't available; 'auth.User' has been swapped for 'users.User'2) create_superuser에 대한 매개 변수의 순서가 잘못되었습니다.

그래서 나는 그것을 다음으로 대체했습니다.

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가 아닌 지역적으로 해석되고 있음을 의미한다는 것입니다. 이것을 정렬하기 위해 명령을 따옴표로 묶었습니다. 그런 다음 전체 파이썬 명령의 작은 따옴표 안에 파이썬 문자열에 대해 삼중 큰 따옴표를 사용해야했습니다.

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

Adam Charnock 의 접근 방식을 기반으로 한 솔루션 은 현재 Python 패키지로 제공됩니다. 세 단계가 필요합니다.

  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

이 작은 파이썬 스크립트는 일반 사용자 또는 수퍼 유저를 만들 수 있습니다.

#!/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

나는 shell --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 마이그레이션
  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.