Programming

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

procodes 2020. 8. 24. 21:41
반응형

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


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

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


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

나는 이것에 대한 답을 직접 찾고 있었다. 기본 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'

이는 기본 명령 사용을 계속 지원하는 동시에 암호를 지정하는 데 비대화 형 사용을 허용한다는 장점이 있습니다.


나는 './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


수퍼 유저 생성 자동화를 처리하기 위해 간단한 python 스크립트를 작성할 수 있습니다. User독립 실행 형 장고 스크립트를 작성하는 일반적인 과정을 따라 줄 수 있도록 모델, 그냥 일반 장고 모델입니다. 전의:

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하면 새 수퍼 유저를 자동으로 생성 할 수 있지만 비밀번호를 설정할 때까지 로그인 할 수 없습니다.


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

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

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),
    ]

도움이 되었기를 바랍니다.


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

  • 사용자가 존재하고 @Groady가 ​​주석에서 언급 한대로 사용자를 삭제하면 계단식 삭제를 통해 관련 레코드를 실수로 삭제할 위험이 있습니다.
  • Checks superuser existence filtering by mail so if two superusers have the same mail god knows which one it deletes.
  • It is cumbersome to update the script parameters: username, password, and mail.
  • Does not log what it did.

An improved version would be:

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

I used Tk421 one liner but got an error message as: 1) I think I am using a later version of Django (1.10) Manager isn't available; 'auth.User' has been swapped for 'users.User' 2) the order of the parameters to create_superuser was wrong.

So I replaced it with:

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

and what I as really pleased with is that it works on a heroku deployment as well:

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

This will work nicely repeatedly. I am using it the beginning of a project so don't worry about the terrible cascaded deletes that might occur later.

I have revisited after some trouble with running this inside local() from fabric. what seemed to be happening is that the pipe symbol mean that it was getting interpreted locally rather than on heroku. To sort this I wrapped in the command in quotes. Then had to used triple double quotes for the python strings inside the single quotes of the whole python command.

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"

very easy, listen on post syncdb signal and read superuser credentials from a configuration file and apply it.

checkout django-bootup

https://github.com/un33k/django-bootup/blob/master/README


This small python script could create a normal user or a superuser

#!/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 are not mandatory.

If --superuser is not defined, normal user will be created If --password is not defined, a random password will be generated

    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 

This is what I cobbled together for Heroku post_deploy and a predefined app.json variable:

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

With this you can have a single env variable:

CREATE_SUPER_USER=admin:admin@example.com:password

I like the shell --command option, but not sure how the get newline character in the command script. Without the newline the if expression results in syntax error.


Go to command prompt and type:

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

if not executed the migration then go to django application folder and execute following

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

then bingo.


A solution based on Adam Charnock's approach above is available as a Python package by now. It takes three steps:

  1. Install: pip install django-createsuperuserwithpassword

  2. Activate: INSTALLED_APPS += ("django_createsuperuserwithpassword", )

  3. Apply:

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

That's it.

참고URL : https://stackoverflow.com/questions/6244382/how-to-automate-createsuperuser-on-django

반응형