Как автоматизировать создание пользователей на Django? - PullRequest
87 голосов
/ 05 июня 2011

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

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

Ответы [ 12 ]

116 голосов
/ 29 сентября 2014

Если вы ссылаетесь на Пользователь напрямую, ваш код не будет работать в проектах, в которых параметр 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
31 голосов
/ 27 февраля 2017

Я сам искал ответ на этот вопрос.Я решил создать команду Django, которая расширяет команду base 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'

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

25 голосов
/ 15 марта 2017

Я использую './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

12 голосов
/ 05 июня 2011

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

6 голосов
/ 30 ноября 2018

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

Тогда ваша миграция данных будет выглядеть так:

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

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

6 голосов
/ 10 января 2017

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

  • Удаляет пользователя, если он существует, и, как отмечено @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
1 голос
/ 14 июня 2017

Я использовал один вкладыш 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 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 () из фабрики.то, что, казалось, происходило, - то, что символ трубы означает, что это интерпретировалось локально, а не на герою.Для сортировки я обернул команду в кавычки.Затем пришлось использовать тройные двойные кавычки для строк 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"
0 голосов
/ 10 июня 2019

A решение на основе Адам Чарнок * Подход 1004 * выше уже доступен как пакет 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 голосов
/ 27 мая 2019

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

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

, затем бинго.

0 голосов
/ 24 ноября 2017

Это то, что я собрал вместе для 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:admin@example.com:password

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...