Я хочу автоматичний запуск manage.py createsuperuser
на django
але шви , що не існує ніякого способу установки пароля за замовчуванням.
Як я можу це отримати? Він повинен бути незалежним від бази даних django.
Я хочу автоматичний запуск manage.py createsuperuser
на django
але шви , що не існує ніякого способу установки пароля за замовчуванням.
Як я можу це отримати? Він повинен бути незалежним від бази даних django.
Відповіді:
Якщо ви посилаєтесь на Користувача безпосередньо, ваш код не працюватиме в проектах, де налаштування 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
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
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')
Я сам шукав відповідь на це. Я вирішив створити команду 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'
Це має перевагу в тому, що він підтримує використання команд за замовчуванням, а також дозволяє неінтерактивне використання для введення пароля.
createsuperuser
було і це --password
поле
./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'
createsuperuser2
відображається цей клас, функція
createsuperuser2.py
та розмістити його у визначеній структурі каталогу за посиланням вище.
Я використовую './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
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
users.User
auth.User
Я б запропонував запустити міграцію даних , тому, коли міграції застосовуються до проекту, створюється суперпользователь, як частина міграцій. Ім'я користувача та пароль можна налаштувати як змінні середовища. Це також корисно під час запуску програми в контейнері (див. Приклад цієї теми )
Потім ваша міграція даних виглядатиме приблизно так:
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
файлі.
root/mysite/myapp/migrations
- якщо ви читаєте документи, це пояснює, як ви можете створити порожню міграцію та змінити їїpython manage.py makemigrations --empty yourappname
settings.py
файлу:python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
На 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
до своїх сценаріїв та конвеєрів.
Ви можете написати простий скрипт 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
, що дозволить вам автоматично створювати нові суперкористувача, але вони не зможуть увійти в систему, поки ви не встановите пароль для них.
cretesuperuser
, але як тоді встановити пароль? Я хотів би зробити це всередині баш сценарію ...
Поточна найбільш проголосована відповідь:
Удосконалена версія буде:
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
if not User.objects.filter(username = username).exists()
,
DJANGO_SUPERUSER_USERNAME=testuser \
DJANGO_SUPERUSER_PASSWORD=testpass \
python manage.py createsuperuser --noinput
noinput
прапор іншими DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email admin@email.com --noinput
Я використав один лайнер 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"
Рішення на основі Адам Чарнок підходу «s вище є як пакет Python тепер. Це виконує три кроки:
Встановити: pip install django-createsuperuserwithpassword
Активувати: INSTALLED_APPS += ("django_createsuperuserwithpassword", )
Застосувати:
python manage.py createsuperuserwithpassword \
--username admin \
--password admin \
--email admin@example.org \
--preserve
Це воно.
дуже просто, слухайте сигнал після синхронізації та читайте облікові дані суперфігуратора з файлу конфігурації та застосовуйте його.
замовлення django-bootup
Цей невеликий сценарій 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
Це те, що я зробив спільно для 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
вираз призводить до синтаксичної помилки.
Перейдіть до командного рядка та введіть:
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 та виконайте наступне
потім бінго.
З shell_plus насправді набагато простіше
echo "User.objects.create_superuser('test@test.com', 'test')" | python manage.py shell_plus
Як згадували інші, за допомогою Django 3.0 ви можете передавати облікові дані через змінні середовища. Однак цей підхід набагато гнучкіший, оскільки дозволяє виконувати будь-які інші складніші завдання, такі як видалення всіх користувачів тестів тощо.