Вы смотрели, как просто сохранить созданного суперпользователя и загрузить его с помощью manage.py?
turbotux
1
Ответ @turbotux Hendrik F использует подход, аналогичный тому, что вы предлагаете, с добавленной возможностью чтения значений (логин, пароль ...) из env vars (или файловой системы, ...). Я настоятельно рекомендую пойти в этом направлении вместо специальных сценариев python, у которых возникают проблемы при перезапуске приложения.
Объявление N
Ответы:
145
Если вы напрямую ссылаетесь на пользователя , ваш код не будет работать в проектах, где параметр AUTH_USER_MODEL был изменен на другую модель пользователя. Более общий способ создания пользователя:
супер полезно при попытке создать суперпользователя в heroku и ваша сеть блокирует порт 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 01
12
Лично я не думаю, что удаление пользователя в каждой сборке - хорошая идея. Вы рискуете непреднамеренно удалить любые связанные записи с помощью каскадного удаления. Более безопасный вариант - просто выйти из программы, если пользователь уже существует (или обновить существующую запись пользователя).
Will
6
По крайней мере, на Django 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 importCommandErrorclassCommand(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 andnot username:raiseCommandError("--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()
Это имеет то преимущество, что по-прежнему поддерживает использование команд по умолчанию, а также позволяет неинтерактивное использование для указания пароля.
Это не использует дополнительное эхо, это имеет то преимущество, что вы можете передать его в контейнер докера для выполнения. Без необходимости использовать sh -c "...", который вводит вас в кавычки, спасаясь от ада.
И помните, что сначала идет имя пользователя, а не электронная почта.
Если у вас есть собственная модель пользователя, вам нужно импортировать ее, а не auth.models.User
Похоже, у меня не работает, я вижу:AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
Бродан
когда у вас есть настраиваемая модель пользователя, например, users.User вам нужно импортировать из auth.User
нее
30
Я бы предложил запустить миграцию данных , поэтому, когда миграции применяются к проекту, суперпользователь создается как часть миграции. Имя пользователя и пароль могут быть установлены как переменные среды. Это также полезно при запуске приложения в контейнере (см. Этот поток в качестве примера)
Тогда ваша миграция данных будет выглядеть так:
import os
from django.db import migrations
classMigration(migrations.Migration):
dependencies =[('<your_app>','<previous_migration>'),]# can also be emtpy if it's your first migrationdef generate_superuser(apps, schema_editor):from django.contrib.auth.models importUser
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),]
Надеюсь, это поможет!
РЕДАКТИРОВАТЬ : Некоторые могут поднять вопрос, как установить эти переменные среды и заставить Django знать о них. Есть много способов, и на них ответили в других сообщениях SO, но, как быстрый указатель, создание .envфайла - хорошая идея. Затем вы можете использовать пакет python-dotenv , но если вы настроили виртуальную среду с помощью pipenv, он автоматически установит envvars в вашем .envфайле. Аналогичным образом, запуск вашего приложения через docker-compose может читать в вашем .envфайле.
СОВЕТ: рассмотрите этот подход . Это качественный ответ: он, естественно, использует встроенные функции Django для ответа на вопрос вместо повторения специальных сценариев python, плюс он, естественно, решает самую большую проблему принятого ответа (миграция применяется только один раз при развертывании. , поэтому пользователь создается только один раз). Он прекрасно работает в контексте контейнера.
Объявление N
Это кажется отличным ответом. Я до сих пор не знаю, где в проекте подходит этот кусок кода?
Пабло Руис Руис
Он должен быть в вашей папке миграции, например root/mysite/myapp/migrations- если вы читаете документацию, в ней объясняется, как вы можете создать пустую миграцию и изменить ееpython manage.py makemigrations --empty yourappname
Hendrik F
Зачем вам нужен DJANGO_DB_NAME? он никогда не используется.
Thoroc,
Вы должны упомянуть, чтобы добавить следующее для загрузки переменных .env в settings.pyфайл:python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
thoroc
23
На Django 3.0 вы можете использовать по умолчанию createsuperuser --noinputкоманды и установить все необходимые поля (включая пароль) в качестве переменных окружения DJANGO_SUPERUSER_PASSWORD, DJANGO_SUPERUSER_USERNAME, DJANGO_SUPERUSER_EMAILнапример. --noinputфлаг обязателен.
Вы можете написать простой скрипт на Python для автоматизации создания суперпользователя. UserМодель просто нормальная модель Django, так что вы хотите следовать нормальному процессу написания автономного Django сценария. Пример:
Вы также можете передать createsuperuserнесколько параметров, а именно --noinputи --username, которые позволят вам автоматически создавать новых суперпользователей, но они не смогут войти в систему, пока вы не установите для них пароль.
Хорошо cretesuperuser, но как тогда установить пароль? Я хотел бы сделать это внутри сценария bash ...
caneta
10
Текущий ответ с наибольшим количеством голосов:
Удаляет пользователя, если он существует, и, как отмечает @Groady в комментариях, вы рискуете непреднамеренно удалить любые связанные записи с помощью каскадного удаления.
Проверяет существование суперпользователя, фильтруя по почте, поэтому, если два суперпользователя имеют одинаковую почту, бог знает, какой из них он удаляет.
Обновлять параметры скрипта: логин, пароль и почту - громоздко.
Это самое простое решение. Но вы можете перезаписать noinputфлаг другими параметрами:DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email admin@email.com --noinput
dannydedog
1
Я использовал один лайнер Tk421, но получил сообщение об ошибке: 1) Я думаю, что использую более позднюю версию Django (1.10) Manager isn't available; 'auth.User' has been swapped for 'users.User'2) порядок параметров в create_superuser был неправильным.
И что мне действительно понравилось, так это то, что он работает и с развертыванием 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
Это будет хорошо работать повторно. Я использую его в начале проекта, поэтому не беспокойтесь об ужасных каскадных удалениях, которые могут произойти позже.
Я вернулся после некоторых проблем с запуском этого внутри 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"
Мне нравится опция оболочки --command , но я не знаю, как получить символ новой строки в командном скрипте. Без новой строки ifвыражение приводит к синтаксической ошибке.
Как уже упоминалось, с Django 3.0 вы можете передавать учетные данные через переменные среды. Однако этот подход гораздо более гибкий, поскольку он позволяет выполнять любую другую более сложную задачу, например, удалить всех пользователей тестов и т. Д.
Ответы:
Если вы напрямую ссылаетесь на пользователя , ваш код не будет работать в проектах, где параметр AUTH_USER_MODEL был изменен на другую модель пользователя. Более общий способ создания пользователя:
ОРИГИНАЛЬНЫЙ ОТВЕТ
Вот простая версия скрипта для создания суперпользователя:
источник
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 ):Пример использования:
Это имеет то преимущество, что по-прежнему поддерживает использование команд по умолчанию, а также позволяет неинтерактивное использование для указания пароля.
источник
createsuperuser
тоже было это--password
поле./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'
createsuperuser2
сопоставляется с этим классом, функцияcreatesuperuser2.py
и поместить его в определенную структуру каталогов по ссылке выше.Я использую './manage.py shell -c':
Это не использует дополнительное эхо, это имеет то преимущество, что вы можете передать его в контейнер докера для выполнения. Без необходимости использовать sh -c "...", который вводит вас в кавычки, спасаясь от ада.
И помните, что сначала идет имя пользователя, а не электронная почта.
Если у вас есть собственная модель пользователя, вам нужно импортировать ее, а не
auth.models.User
источник
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
users.User
вам нужно импортировать изauth.User
Я бы предложил запустить миграцию данных , поэтому, когда миграции применяются к проекту, суперпользователь создается как часть миграции. Имя пользователя и пароль могут быть установлены как переменные среды. Это также полезно при запуске приложения в контейнере (см. Этот поток в качестве примера)
Тогда ваша миграция данных будет выглядеть так:
Надеюсь, это поможет!
РЕДАКТИРОВАТЬ : Некоторые могут поднять вопрос, как установить эти переменные среды и заставить Django знать о них. Есть много способов, и на них ответили в других сообщениях SO, но, как быстрый указатель, создание
.env
файла - хорошая идея. Затем вы можете использовать пакет python-dotenv , но если вы настроили виртуальную среду с помощью pipenv, он автоматически установит envvars в вашем.env
файле. Аналогичным образом, запуск вашего приложения через docker-compose может читать в вашем.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 сценария. Пример:Вы также можете передать
createsuperuser
несколько параметров, а именно--noinput
и--username
, которые позволят вам автоматически создавать новых суперпользователей, но они не смогут войти в систему, пока вы не установите для них пароль.источник
cretesuperuser
, но как тогда установить пароль? Я хотел бы сделать это внутри сценария bash ...Текущий ответ с наибольшим количеством голосов:
Улучшенная версия будет:
источник
if not User.objects.filter(username = username).exists()
,Документация по команде createuser
источник
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 был неправильным.Поэтому я заменил его на:
И что мне действительно понравилось, так это то, что он работает и с развертыванием heroku:
Это будет хорошо работать повторно. Я использую его в начале проекта, поэтому не беспокойтесь об ужасных каскадных удалениях, которые могут произойти позже.
Я вернулся после некоторых проблем с запуском этого внутри local () из ткани. похоже, что происходит то, что символ трубы означает, что он интерпретировался локально, а не на героку. Чтобы отсортировать это, я заключил команду в кавычки. Затем пришлось использовать тройные двойные кавычки для строк python внутри одинарных кавычек всей команды python.
источник
Решение на основе Адам Чарнок подхода «s выше доступно как пакет Python теперь. Требуется три шага:
Установка:
pip install django-createsuperuserwithpassword
Активация:
INSTALLED_APPS += ("django_createsuperuserwithpassword", )
Подать заявление:
Вот и все.
источник
очень просто, прослушайте сигнал post syncdb, прочтите учетные данные суперпользователя из файла конфигурации и примените их.
источник
Этот небольшой скрипт на Python может создать обычного пользователя или суперпользователя.
--superuser и --password не являются обязательными.
Если --superuser не определен, будет создан обычный пользователь. Если --password не определен, будет сгенерирован случайный пароль.
источник
Это то, что я сколотил для Heroku post_deploy и предопределенной переменной app.json :
При этом у вас может быть одна переменная env:
Мне нравится опция оболочки --command , но я не знаю, как получить символ новой строки в командном скрипте. Без новой строки
if
выражение приводит к синтаксической ошибке.источник
Перейдите в командную строку и введите:
если миграция не выполнена, перейдите в папку приложения django и выполните следующие
затем бинго.
источник
источник
С shell_plus на самом деле намного проще
Как уже упоминалось, с Django 3.0 вы можете передавать учетные данные через переменные среды. Однако этот подход гораздо более гибкий, поскольку он позволяет выполнять любую другую более сложную задачу, например, удалить всех пользователей тестов и т. Д.
источник