Как автоматизировать createuperuser на django?

Я хочу автоматически запустить manage.py createsuperuser на django но кажется, что нет способа установить пароль по умолчанию.

Как я могу получить это? Он должен быть независимым от базы данных django.

Ответ 1

Если вы ссылаетесь на пользователя напрямую, ваш код не будет работать в проектах, в которых параметр AUTH_USER_MODEL был изменен на другую модель пользователя. Более общий способ создания пользователя:

echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', '[email protected]', 'password')" | python manage.py shell

ОРИГИНАЛЬНЫЙ ОТВЕТ

Здесь есть простая версия скрипта для создания суперпользователя:

echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', '[email protected]', 'pass')" | python manage.py shell

Ответ 2

Я искал ответ на это сам. Я решил создать команду 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 '[email protected]'

Это имеет то преимущество, что все еще поддерживает использование команды по умолчанию, а также позволяет неинтерактивное использование для указания пароля.

Ответ 3

Я использую оболочку. /manage.py -c:

./manage.py shell -c "from django.contrib.auth.models import User; User.objects.create_superuser('admin', '[email protected]', 'adminpass')"

Это не использует дополнительное эхо, это дает то преимущество, что вы можете передать его в Docker-контейнер для выполнения. Без необходимости использовать sh -c "...", что приводит вас к тому, что вы уходите от ада.

И помните, что первым приходит имя пользователя, а не электронная почта.

Если у вас есть пользовательская модель пользователя, вам нужно импортировать ее, а не auth.models.User

Ответ 4

Вы можете написать простой python script, чтобы обрабатывать автоматизацию создания суперпользователя. Модель User - это просто нормальная модель Django, поэтому вы должны следовать нормальному процессу написания автономного Django script. Пример:

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, которые позволят вам автоматически создавать новых суперпользователей, но они не смогут входить в систему до тех пор, пока вы не установите для них пароль.

Ответ 5

Я бы предложил запустить Data Migration, поэтому, когда к проекту применяются миграции, в качестве части миграции создается суперпользователь. Имя пользователя и пароль могут быть установлены как переменные среды. Это также полезно при запуске приложения в контейнере (см. этот поток в качестве примера)

Ваша миграция данных будет выглядеть следующим образом:

import os
from django.db import migrations

class Migration(migrations.Migration):
    dependencies = [
        ('<your_app>', '<previous_migration>'),
    ] # can also be emtpy if it 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),
    ]

Надеюсь, это поможет!

Ответ 6

Текущий наиболее проголосовавший ответ:

  • Удаляет пользователя, если он существует, и как отмечено @Groady в комментариях, вы рискуете непреднамеренно удалить любые связанные записи через каскадное удаление.
  • Проверяет фильтрацию существования суперпользователя по почте, поэтому, если два суперпользователя имеют один и тот же почтовый бог, он знает, какой из них он удаляет.
  • Неудобно обновлять параметры script: имя пользователя, пароль и почту.
  • Не регистрирует, что он сделал.

Улучшенная версия:

USER="admin"
PASS="super_password"
MAIL="[email protected]"
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

Ответ 7

Я использовал 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='[email protected]', is_superuser=True).delete(); User.objects.create_superuser('admin', '[email protected]', '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='[email protected]', is_superuser=True).delete(); User.objects.create_superuser('admin', '[email protected]', 'nimda')" | python manage.py shell

Это будет работать многократно. Я использую его в начале проекта, поэтому не беспокойтесь о страшных каскадных удалениях, которые могут возникнуть позже.

Я передумал после некоторых проблем с запуском этого внутри local() из ткани. что, казалось, происходит, так это то, что символ трубы означает, что он интерпретируется локально, а не на героку. Чтобы отсортировать это, я завернул команду в кавычки. Затем пришлось использовать тройные двойные кавычки для строк python внутри одинарных кавычек всей команды python.

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

Ответ 8

очень просто, послушать сигнал post syncdb и прочитать учетные данные суперпользователя из файла конфигурации и применить его.

checkout django-bootup

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

Ответ 9

Этот маленький python script может создать обычного пользователя или суперпользователя

#!/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:]))

- суперпользователь и --password не являются обязательными.

Если --superuser не определен, будет создан обычный пользователь Если -password не определен, будет создан случайный пароль

    Ex : 
        /var/www/vhosts/PROJECT/python27/bin/python /usr/local/sbin/manage_dja_superusertest.py --username USERNAME --email [email protected] --project_dir /var/www/vhosts/PROJECT/PROJECT/ --settings PROJECT.settings.env 

Ответ 10

Это то, что я собрал вместе для 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

С этим вы можете иметь одну переменную env:

CREATE_SUPER_USER=admin:[email protected]:password

Мне нравится параметр shell --command, но не уверен, как получить символ новой строки в команде script. Без новой строки выражение if приводит к синтаксической ошибке.

Ответ 11

Перейдите в командную строку и введите:

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 создает суперпользователя

затем бинго.

Ответ 12

Решение, основанное на подходе Адама Чарнока выше, теперь доступно в виде пакета Python. Требуется три шага:

  1. Установить: pip install django-createsuperuserwithpassword

  2. Активировать: INSTALLED_APPS += ("django_createsuperuserwithpassword", )

  3. Применять:

    python manage.py createsuperuserwithpassword \
            --username admin \
            --password admin \
            --email [email protected] \
            --preserve
    

Это.