você procurou apenas salvar o superusuário criado em um equipamento e carregá-lo usando o manage.py?
turbotux
1
A resposta do @turbotux Hendrik F segue uma abordagem semelhante à sugerida, com a capacidade adicional de ler os valores (login, senha ...) dos env vars (ou sistema de arquivos, ...). Eu sugiro ir nessa direção em vez dos scripts ad-hoc python, que têm problemas quando você reinicia o aplicativo.
Ad N
Respostas:
145
Se você referenciar o usuário diretamente, seu código não funcionará em projetos nos quais a configuração AUTH_USER_MODEL foi alterada para um modelo de usuário diferente. Uma maneira mais genérica de criar o usuário seria:
super útil ao tentar criar superusuário no heroku e sua rede bloqueia a porta 5000
Vic
4
Eu iria apagar o superusuário existente, de modo que este é válido para cada compilação: echo "from django.contrib.auth.models import User; User.objects.filter(email='[email protected]').delete(); User.objects.create_superuser('[email protected]', 'admin', 'nimda')" | python manage.py shell
Montaro
12
Pessoalmente, não acho que excluir o usuário em cada build seja uma boa ideia. Você corre o risco de excluir acidentalmente quaisquer registros associados por meio de uma exclusão em cascata. Uma opção mais segura é simplesmente resgatar se o usuário já existe (ou atualizar o registro existente do usuário).
Will
6
Pelo menos no Django 1.11. a ordem dos argumentos é ('nome de usuário', 'email', 'aprovação'), não ('email', 'nome de usuário', 'aprovação'). Veja: docs.djangoproject.com/en/1.11/ref/contrib/auth/…
np8
3
from django.contrib.auth.models import Usernão funciona mais. Use isto: from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', '[email protected]', 'my secure password')
dcalde 10/06
49
Eu mesmo estava procurando uma resposta para isso. Eu decidi criar um comando Django que estende o createsuperusercomando base ( 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()
Isso não usa um eco extra; isso tem o benefício de que você pode transmiti-lo para um contêiner de docker para execução. Sem a necessidade de usar sh -c "..." que o leva a citar escapando do inferno.
E lembre-se de que primeiro vem o nome de usuário, do que o email.
Se você possui um modelo de usuário personalizado, é necessário importá-lo e não auth.models.User
Não parece trabalhar para mim, eu estou vendo:AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
Brodan
quando você tem um modelo de usuário personalizado, como users.User você precisa importar a partir dele e não a partir deauth.User
yvess
30
Eu sugeriria a execução de uma migração de dados ; portanto, quando as migrações são aplicadas ao projeto, um superusuário é criado como parte das migrações. O nome de usuário e a senha podem ser configurados como variáveis de ambiente. Isso também é útil ao executar um aplicativo em um contêiner (veja este tópico como um exemplo)
Sua migração de dados ficaria assim:
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),]
Espero que ajude!
EDIT : Alguns podem levantar a questão de como definir essas variáveis de ambiente e tornar o Django ciente delas. Existem várias maneiras e isso foi respondido em outras postagens do SO, mas, como um ponteiro rápido, criar um .envarquivo é uma boa idéia. Você pode usar o pacote python-dotenv , mas se você configurou um ambiente virtual com o pipenv, ele definirá automaticamente os envvars no seu .envarquivo. Da mesma forma, a execução do aplicativo via docker-compose pode ser lida no seu .envarquivo.
DICA: Por favor, considere esta abordagem . Esta é uma resposta de alta qualidade: ela naturalmente aproveita as funcionalidades internas do Django para responder à pergunta em vez de repetir scripts python ad-hoc, além de tratar naturalmente do maior problema da resposta aceita (a migração é aplicada apenas uma vez em uma implantação , para que o usuário seja criado apenas uma vez). Funciona lindamente em um contexto de contêiner.
Ad N
Esta parece ser uma ótima resposta. Ainda não sei em que parte do projeto esse código se encaixa?
Pablo Ruiz Ruiz
Ele deve estar em sua pasta migrações, por exemplo root/mysite/myapp/migrations- se o seu ler os docs, ele explica como você pode criar uma migração vazio e modificar essepython manage.py makemigrations --empty yourappname
Hendrik F
Por que você precisa do DJANGO_DB_NAME? nunca é usado.
thoroc 13/06
Você deve mencionar para adicionar o seguinte para carregar os vars .env no settings.pyarquivo:python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
thoroc
22
A partir de Django 3.0, você pode usar o padrão createsuperuser --noinputde comando e defina todos os campos obrigatórios (incluindo senha) como variáveis de ambiente DJANGO_SUPERUSER_PASSWORD, DJANGO_SUPERUSER_USERNAME, DJANGO_SUPERUSER_EMAILpor exemplo. --noinputsinalizador é obrigatório.
Você pode escrever um script python simples para lidar com a automação da criação de superusuário. O Usermodelo é apenas um modelo normal do Django, então você deve seguir o processo normal de escrever um script Django independente. Ex:
Você também pode passar createsuperuseralgumas opções, a saber, --noinpute --username, que permitiriam criar automaticamente novos superusuários, mas eles não seriam capazes de efetuar login até você definir uma senha para eles.
Ok cretesuperuser, mas como definir a senha? Eu gostaria de fazer isso dentro de um script bash ...
caneta
10
Resposta mais votada atual:
Exclui o usuário, se houver, e conforme observado por @Groady nos comentários, você corre o risco de excluir acidentalmente quaisquer registros associados por meio de uma exclusão em cascata.
Verifica a existência do superusuário filtrando por e-mail, se dois superusuários tiverem o mesmo e-mail, ele saberá qual deles será excluído.
É complicado atualizar os parâmetros do script: nome de usuário, senha e email.
Esta é a solução mais fácil. Mas você pode substituir a noinputbandeira com outros parâmetros:DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email [email protected] --noinput
dannydedog 23/06
1
Eu usei o Tk421 em uma linha, mas recebi uma mensagem de erro como: 1) Acho que estou usando uma versão posterior do Django (1.10) Manager isn't available; 'auth.User' has been swapped for 'users.User'2) a ordem dos parâmetros para create_superuser estava errada.
e o que mais me agradou é que ele também funciona em uma implantação 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
Isso funcionará bem repetidamente. Estou usando-o no início de um projeto, portanto, não se preocupe com as terríveis exclusões em cascata que podem ocorrer mais tarde.
Eu revisitei após alguns problemas com a execução deste local dentro () do fabric. o que parecia estar acontecendo é que o símbolo do cachimbo significa que estava sendo interpretado localmente, e não no heroku. Para classificar isso, envolvi o comando entre aspas. Em seguida, teve que usar aspas duplas triplas para as seqüências de caracteres python dentro das aspas simples de todo o comando 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"
Eu gosto da opção shell --command , mas não sei como o caractere get newline no script de comando. Sem a nova linha, a ifexpressão resulta em erro de sintaxe.
Como outros mencionados, no Django 3.0 você pode passar as credenciais através de variáveis de ambiente. No entanto, essa abordagem é muito mais flexível, pois permite executar qualquer outra tarefa mais complicada, como remover todos os usuários de testes, etc.
Respostas:
Se você referenciar o usuário diretamente, seu código não funcionará em projetos nos quais a configuração AUTH_USER_MODEL foi alterada para um modelo de usuário diferente. Uma maneira mais genérica de criar o usuário seria:
RESPOSTA ORIGINAL
Aqui está uma versão simples do script para criar um superusuário:
fonte
echo "from django.contrib.auth.models import User; User.objects.filter(email='[email protected]').delete(); User.objects.create_superuser('[email protected]', 'admin', 'nimda')" | python manage.py shell
from django.contrib.auth.models import User
não funciona mais. Use isto:from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', '[email protected]', 'my secure password')
Eu mesmo estava procurando uma resposta para isso. Eu decidi criar um comando Django que estende o
createsuperuser
comando base ( GitHub ):Exemplo de uso:
Isso tem a vantagem de ainda suportar o uso padrão do comando, além de permitir o uso não interativo para especificar uma senha.
fonte
createsuperuser
tinha esse--password
campo também./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email '[email protected]'
createsuperuser2
mapeado para esta classe, funçãocreatesuperuser2.py
e colocá-lo na estrutura de diretórios definida no link acima.Eu uso './manage.py shell -c':
Isso não usa um eco extra; isso tem o benefício de que você pode transmiti-lo para um contêiner de docker para execução. Sem a necessidade de usar sh -c "..." que o leva a citar escapando do inferno.
E lembre-se de que primeiro vem o nome de usuário, do que o email.
Se você possui um modelo de usuário personalizado, é necessário importá-lo e não
auth.models.User
fonte
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
users.User
você precisa importar a partir dele e não a partir deauth.User
Eu sugeriria a execução de uma migração de dados ; portanto, quando as migrações são aplicadas ao projeto, um superusuário é criado como parte das migrações. O nome de usuário e a senha podem ser configurados como variáveis de ambiente. Isso também é útil ao executar um aplicativo em um contêiner (veja este tópico como um exemplo)
Sua migração de dados ficaria assim:
Espero que ajude!
EDIT : Alguns podem levantar a questão de como definir essas variáveis de ambiente e tornar o Django ciente delas. Existem várias maneiras e isso foi respondido em outras postagens do SO, mas, como um ponteiro rápido, criar um
.env
arquivo é uma boa idéia. Você pode usar o pacote python-dotenv , mas se você configurou um ambiente virtual com o pipenv, ele definirá automaticamente os envvars no seu.env
arquivo. Da mesma forma, a execução do aplicativo via docker-compose pode ser lida no seu.env
arquivo.fonte
root/mysite/myapp/migrations
- se o seu ler os docs, ele explica como você pode criar uma migração vazio e modificar essepython manage.py makemigrations --empty yourappname
settings.py
arquivo:python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
A partir de Django 3.0, você pode usar o padrão
createsuperuser --noinput
de comando e defina todos os campos obrigatórios (incluindo senha) como variáveis de ambienteDJANGO_SUPERUSER_PASSWORD
,DJANGO_SUPERUSER_USERNAME
,DJANGO_SUPERUSER_EMAIL
por exemplo.--noinput
sinalizador é obrigatório.Isso vem dos documentos originais: https://docs.djangoproject.com/en/3.0/ref/django-admin/#django-admin-createsuperuser
e acabei de verificar - funciona. Agora você pode exportar facilmente esses vars de ambiente e adicionar
createsuperuser
seus scripts e pipelines.fonte
Você pode escrever um script python simples para lidar com a automação da criação de superusuário. O
User
modelo é apenas um modelo normal do Django, então você deve seguir o processo normal de escrever um script Django independente. Ex:Você também pode passar
createsuperuser
algumas opções, a saber,--noinput
e--username
, que permitiriam criar automaticamente novos superusuários, mas eles não seriam capazes de efetuar login até você definir uma senha para eles.fonte
cretesuperuser
, mas como definir a senha? Eu gostaria de fazer isso dentro de um script bash ...Resposta mais votada atual:
Uma versão melhorada seria:
fonte
if not User.objects.filter(username = username).exists()
,Documentação para o comando createuser
fonte
noinput
bandeira com outros parâmetros:DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email [email protected] --noinput
Eu usei o Tk421 em uma linha, mas recebi uma mensagem de erro como: 1) Acho que estou usando uma versão posterior do Django (1.10)
Manager isn't available; 'auth.User' has been swapped for 'users.User'
2) a ordem dos parâmetros para create_superuser estava errada.Então substituí-o por:
e o que mais me agradou é que ele também funciona em uma implantação heroku:
Isso funcionará bem repetidamente. Estou usando-o no início de um projeto, portanto, não se preocupe com as terríveis exclusões em cascata que podem ocorrer mais tarde.
Eu revisitei após alguns problemas com a execução deste local dentro () do fabric. o que parecia estar acontecendo é que o símbolo do cachimbo significa que estava sendo interpretado localmente, e não no heroku. Para classificar isso, envolvi o comando entre aspas. Em seguida, teve que usar aspas duplas triplas para as seqüências de caracteres python dentro das aspas simples de todo o comando python.
fonte
Uma solução baseada na abordagem de Adam Charnock acima já está disponível como um pacote Python. São necessários três passos:
Instalar:
pip install django-createsuperuserwithpassword
Ativar:
INSTALLED_APPS += ("django_createsuperuserwithpassword", )
Aplique:
É isso aí.
fonte
muito fácil, ouça o sinal post syncdb, leia as credenciais do superusuário de um arquivo de configuração e aplique-o.
fonte
Esse pequeno script python pode criar um usuário normal ou um superusuário
--superuser e --password não são obrigatórios.
Se --superuser não estiver definido, o usuário normal será criado. Se --password não estiver definido, uma senha aleatória será gerada
fonte
Isto é o que eu juntei para Heroku post_deploy e uma variável app.json predefinida :
Com isso, você pode ter uma única variável env:
Eu gosto da opção shell --command , mas não sei como o caractere get newline no script de comando. Sem a nova linha, a
if
expressão resulta em erro de sintaxe.fonte
Vá para o prompt de comando e digite:
se não executou a migração, vá para a pasta do aplicativo django e execute as seguintes
depois bingo.
fonte
fonte
Com shell_plus é muito mais fácil, na verdade
Como outros mencionados, no Django 3.0 você pode passar as credenciais através de variáveis de ambiente. No entanto, essa abordagem é muito mais flexível, pois permite executar qualquer outra tarefa mais complicada, como remover todos os usuários de testes, etc.
fonte