Як автоматизувати створення виконавця на джанго?


128

Я хочу автоматичний запуск manage.py createsuperuserна djangoале шви , що не існує ніякого способу установки пароля за замовчуванням.

Як я можу це отримати? Він повинен бути незалежним від бази даних django.


1
Ви вже розглядали можливість збереження створеного суперузерного кріплення та завантаження його за допомогою Manag.py?
турботукс

1
@turbotux Відповідь Хендріка F використовує аналогічний підхід до запропонованого вами, з додатковою здатністю читати значення (логін, пароль ...) з env vars (або файлової системи, ...). Я б настійно пропонував перейти у цьому напрямку замість спеціальних сценаріїв python, у яких виникають проблеми при перезапуску програми.
Оголошення N

Відповіді:


145

Якщо ви посилаєтесь на Користувача безпосередньо, ваш код не працюватиме в проектах, де налаштування 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
Супер корисно при спробі створити суперрусера в героку і ваша мережа блокує порт 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
Принаймні, на Джанго 1,11. порядок аргументів - ('ім'я користувача', 'електронна пошта', 'пропуск'), а не ('електронна пошта', 'ім'я користувача', 'пропуск'). Дивіться: 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

Я сам шукав відповідь на це. Я вирішив створити команду 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поле
shadi

1
Ви можете додати приклад використання:./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'
shadi

2
як createsuperuser2відображається цей клас, функція
Шрінат Ганеш,

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')"

Це не використовує додаткового відлуння. Це має ту перевагу, що ви можете передати його до докерного контейнера для виконання. Без потреби використовувати sh -c "...", що вводить вас у цитату, що втече пекло.

І пам’ятайте, що спочатку приходить ім'я користувача, ніж електронний лист.

Якщо у вас є власна модель користувача, вам потрібно імпортувати це, а не auth.models.User


1
Працювали для мене. Дякую!
TimH - Кодидакт

Здається, це не працює на мене, я бачу:AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
Brodan

коли у вас є users.Userauth.User
власна

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

Сподіваюся, що це допомагає!

EDIT : Деякі можуть поставити питання про те, як встановити ці змінні середовища та зробити так, щоб Django їх усвідомлював. Є багато способів, і на нього відповіли в інших публікаціях SO, але так само, як швидкий вказівник, створення .envфайлу є хорошою ідеєю. Потім ви можете використовувати пакет python-dotenv , але якщо ви встановите віртуальне середовище з pipenv, він автоматично встановить envvars у вашому .envфайлі. Так само запуск програми через докер-композицію може читати у вашому .envфайлі.


1
ПОРАДА: Будь ласка, врахуйте такий підхід . Це високоякісна відповідь: вона, природно, використовує вбудовані функціональні можливості Django для відповіді на запитання замість того, щоб повторювати спеціальні сценарії пітона, а також, природно, вирішує найбільшу проблему прийнятої відповіді (міграція застосовується лише один раз при розгортанні , тому користувач створюється лише один раз). Це прекрасно працює в контейнерному контексті.
Оголошення N

Це здається чудовою відповіддю. Я досі не знаю, де в проекті вміщується цей фрагмент коду?
Пабло Руїс Руїз

Це має бути у вашій папці міграції, наприклад root/⁨mysite⁩/myapp⁩/⁨migrations⁩- якщо ви читаєте документи, це пояснює, як ви можете створити порожню міграцію та змінити їїpython manage.py makemigrations --empty yourappname
Hendrik F

Навіщо вам потрібен DJANGO_DB_NAME? він ніколи не використовується.
торок

Вам слід згадати, щоб додати .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)
toroc

23

На Django 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, але як тоді встановити пароль? Я хотів би зробити це всередині баш сценарію ...
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


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

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

Я переглянув після деяких проблем із запуском цього всередині локального () з тканини. що, здавалося, відбувається, що символ труби означає, що його тлумачили локально, а не героїку. Для сортування цього я загорнув команду в лапки. Потім довелося використовувати потрійні подвійні лапки для рядків 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

Рішення на основі Адам Чарнок підходу «s вище є як пакет 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

дуже просто, слухайте сигнал після синхронізації та читайте облікові дані суперфігуратора з файлу конфігурації та застосовуйте його.

замовлення django-bootup

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


2
посилання більше не доступне
Tk421,

Це за адресою: github.com/un33k/django-bootup - але це говорить про застаріле на користь github.com/un33k/django-finalware
stephendwolff

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 & - пароль не є обов'язковим.

Якщо --суператор не визначений, буде створений звичайний користувач. Якщо - пароль не визначено, буде генерований випадковий пароль

    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

За допомогою цього ви можете мати одну змінну env:

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 Manag.py мігрувати
  2. python Manag.py створює перетворювач

потім бінго.


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 ви можете передавати облікові дані через змінні середовища. Однак цей підхід набагато гнучкіший, оскільки дозволяє виконувати будь-які інші складніші завдання, такі як видалення всіх користувачів тестів тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.