avez-vous simplement envisagé de sauvegarder votre superutilisateur créé un appareil et de le charger à l'aide de manage.py?
turbotux
1
@turbotux Hendrik F answer adopte une approche similaire à ce que vous suggérez, avec la possibilité supplémentaire de lire les valeurs (login, mot de passe ...) depuis les variables d'environnement (ou système de fichiers, ...). Je suggérerais fortement d'aller dans cette direction au lieu des scripts python ad hoc, qui rencontrent des problèmes lorsque vous redémarrez l'application.
Annonce N du
Réponses:
145
Si vous référencez l' utilisateur directement, votre code ne fonctionnera pas dans les projets où le paramètre AUTH_USER_MODEL a été remplacé par un modèle utilisateur différent. Une manière plus générique de créer l'utilisateur serait:
super utile lorsque vous essayez de créer un super-utilisateur dans heroku et que votre réseau bloque le port 5000
Vic
4
Je supprimerais le superutilisateur existant, donc ceci est valable pour chaque build: 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
Personnellement, je ne pense pas que la suppression de l'utilisateur sur chaque build soit une bonne idée. Vous risquez de supprimer involontairement les enregistrements associés via une suppression en cascade. Une option plus sûre consiste simplement à renflouer si l'utilisateur existe déjà (ou à mettre à jour l'enregistrement utilisateur existant).
from django.contrib.auth.models import Userne fonctionne plus. Utilisez ceci: from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', '[email protected]', 'my secure password')
dcalde
49
Je cherchais moi-même une réponse à cela. J'ai décidé de créer une commande Django qui étend la createsuperusercommande de 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()
Cela présente l'avantage de toujours prendre en charge l'utilisation de la commande par défaut, tout en permettant une utilisation non interactive pour la spécification d'un mot de passe.
Cela n'utilise pas d'écho supplémentaire, cela présente l'avantage de pouvoir le transmettre à un conteneur docker pour exécution. Sans avoir besoin d'utiliser sh -c "..." ce qui vous amène à échapper à l'enfer.
Et rappelez-vous que le nom d'utilisateur vient en premier , plutôt que l'e-mail.
Si vous avez un modèle utilisateur personnalisé, vous devez l'importer et non auth.models.User
Ne semble pas fonctionner pour moi, je vois:AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
Brodan
lorsque vous avez un modèle utilisateur personnalisé comme users.User vous devez importer de celui-ci et non deauth.User
yvess
30
Je suggérerais d'exécuter une migration de données , donc lorsque les migrations sont appliquées au projet, un superutilisateur est créé dans le cadre des migrations. Le nom d'utilisateur et le mot de passe peuvent être configurés en tant que variables d'environnement. Ceci est également utile lors de l'exécution d'une application dans un conteneur (voir ce fil à titre d'exemple)
Votre migration de données ressemblerait alors à ceci:
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),]
J'espère que cela pourra aider!
EDIT : Certains pourraient soulever la question de savoir comment définir ces variables d'environnement et en informer Django. Il existe de nombreuses façons et cela a été répondu dans d'autres articles SO, mais juste comme un pointeur rapide, la création d'un .envfichier est une bonne idée. Vous pouvez alors utiliser le package python-dotenv , mais si vous avez configuré un environnement virtuel avec pipenv, il définira automatiquement les envvars dans votre .envfichier. De même, l'exécution de votre application via docker-compose peut lire votre .envfichier.
CONSEIL: Veuillez considérer cette approche . C'est une réponse de haute qualité: elle exploite naturellement les fonctionnalités intégrées de Django pour répondre à la question au lieu de faire écho aux scripts python ad-hoc, et elle résout naturellement le plus gros problème de la réponse acceptée (une migration n'est appliquée qu'une seule fois sur un déploiement , de sorte que l'utilisateur n'est créé qu'une seule fois). Cela fonctionne à merveille dans un contexte de conteneur.
Annonce N du
Cela semble une excellente réponse. Je ne sais toujours pas où dans le projet ce morceau de code s'inscrit?
Pablo Ruiz Ruiz
Il devrait être dans votre dossier de migrations, par exemple root/mysite/myapp/migrations- si vous lisez la documentation, cela explique comment vous pouvez créer une migration vide et la modifierpython manage.py makemigrations --empty yourappname
Hendrik F
Pourquoi avez-vous besoin de DJANGO_DB_NAME? il n'est jamais utilisé.
thoroc le
Vous devez mentionner d'ajouter ce qui suit pour charger les variables .env dans le settings.pyfichier:python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
thoroc
23
A partir de Django 3.0 , vous pouvez utiliser par défaut createsuperuser --noinputcommande et définir tous les champs obligatoires (y compris le mot de passe) comme variables d'environnement DJANGO_SUPERUSER_PASSWORD, DJANGO_SUPERUSER_USERNAME, DJANGO_SUPERUSER_EMAILpar exemple. --noinputdrapeau est requis.
et je viens de vérifier - cela fonctionne. Vous pouvez désormais exporter facilement ces variables d'environnement et les ajouter createsuperuserà vos scripts et pipelines.
Vous pouvez écrire un simple script python pour gérer l'automatisation de la création des super-utilisateurs. Le Usermodèle est juste un modèle Django normal, vous suivrez donc le processus normal d'écriture d'un script Django autonome. Ex:
Vous pouvez également passer createsuperuserquelques options, à savoir --noinputet --username, qui vous permettraient de créer automatiquement de nouveaux super-utilisateurs, mais ils ne pourraient pas se connecter tant que vous ne leur aurez pas défini un mot de passe.
Ok pour cretesuperuser, mais comment définir le mot de passe alors? Je voudrais faire cela dans un script bash ...
caneta
10
Réponse la plus votée actuelle:
Supprime l'utilisateur s'il existe et comme indiqué par @Groady dans les commentaires, vous risquez de supprimer involontairement les enregistrements associés via une suppression en cascade.
Vérifie le filtrage de l'existence des super-utilisateurs par courrier, donc si deux super-utilisateurs ont le même courrier, Dieu sait lequel il supprime.
Il est difficile de mettre à jour les paramètres du script: nom d'utilisateur, mot de passe et courrier.
C'est la solution la plus simple. Mais vous pouvez écraser le noinputdrapeau avec d'autres paramètres:DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email [email protected] --noinput
dannydedog
1
J'ai utilisé une doublure Tk421 mais j'ai reçu un message d'erreur comme: 1) Je pense que j'utilise une version ultérieure de Django (1.10) Manager isn't available; 'auth.User' has been swapped for 'users.User'2) l'ordre des paramètres à create_superuser était incorrect.
et ce qui me plaît vraiment, c'est que cela fonctionne également sur un déploiement 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
Cela fonctionnera bien à plusieurs reprises. Je l'utilise au début d'un projet, alors ne vous inquiétez pas des terribles suppressions en cascade qui pourraient survenir plus tard.
J'ai revisité après quelques problèmes avec l'exécution de ceci dans local () à partir de fabric. ce qui semblait se passer, c'est que le symbole du tuyau signifiait qu'il était interprété localement plutôt que sur heroku. Pour trier cela, j'ai enveloppé la commande entre guillemets. Ensuite, j'ai dû utiliser des guillemets doubles triples pour les chaînes python à l'intérieur des guillemets simples de toute la commande 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"
très facile, écoutez le signal post-syncdb et lisez les informations d'identification du super-utilisateur à partir d'un fichier de configuration et appliquez-le.
J'aime l' option shell --command , mais je ne sais pas comment obtenir le caractère de nouvelle ligne dans le script de commande. Sans la nouvelle ligne, l' ifexpression entraîne une erreur de syntaxe.
Comme d'autres l'ont mentionné, avec Django 3.0, vous pouvez transmettre les informations d'identification via des variables d'environnement. Cependant, cette approche est beaucoup plus flexible car elle vous permet d'effectuer toute autre tâche plus compliquée comme la suppression de tous les utilisateurs de tests, etc.
Réponses:
Si vous référencez l' utilisateur directement, votre code ne fonctionnera pas dans les projets où le paramètre AUTH_USER_MODEL a été remplacé par un modèle utilisateur différent. Une manière plus générique de créer l'utilisateur serait:
RÉPONSE ORIGINALE
Voici une version simple du script pour créer un superutilisateur:
la source
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
ne fonctionne plus. Utilisez ceci:from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', '[email protected]', 'my secure password')
Je cherchais moi-même une réponse à cela. J'ai décidé de créer une commande Django qui étend la
createsuperuser
commande de base ( GitHub ):Exemple d'utilisation:
Cela présente l'avantage de toujours prendre en charge l'utilisation de la commande par défaut, tout en permettant une utilisation non interactive pour la spécification d'un mot de passe.
la source
createsuperuser
ait aussi ce--password
champ./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email '[email protected]'
createsuperuser2
mappé à cette classe, fonctioncreatesuperuser2.py
et le placer dans la structure de répertoire définie à partir du lien ci-dessus.J'utilise './manage.py shell -c':
Cela n'utilise pas d'écho supplémentaire, cela présente l'avantage de pouvoir le transmettre à un conteneur docker pour exécution. Sans avoir besoin d'utiliser sh -c "..." ce qui vous amène à échapper à l'enfer.
Et rappelez-vous que le nom d'utilisateur vient en premier , plutôt que l'e-mail.
Si vous avez un modèle utilisateur personnalisé, vous devez l'importer et non
auth.models.User
la source
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
users.User
vous devez importer de celui-ci et non deauth.User
Je suggérerais d'exécuter une migration de données , donc lorsque les migrations sont appliquées au projet, un superutilisateur est créé dans le cadre des migrations. Le nom d'utilisateur et le mot de passe peuvent être configurés en tant que variables d'environnement. Ceci est également utile lors de l'exécution d'une application dans un conteneur (voir ce fil à titre d'exemple)
Votre migration de données ressemblerait alors à ceci:
J'espère que cela pourra aider!
EDIT : Certains pourraient soulever la question de savoir comment définir ces variables d'environnement et en informer Django. Il existe de nombreuses façons et cela a été répondu dans d'autres articles SO, mais juste comme un pointeur rapide, la création d'un
.env
fichier est une bonne idée. Vous pouvez alors utiliser le package python-dotenv , mais si vous avez configuré un environnement virtuel avec pipenv, il définira automatiquement les envvars dans votre.env
fichier. De même, l'exécution de votre application via docker-compose peut lire votre.env
fichier.la source
root/mysite/myapp/migrations
- si vous lisez la documentation, cela explique comment vous pouvez créer une migration vide et la modifierpython manage.py makemigrations --empty yourappname
settings.py
fichier: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 , vous pouvez utiliser par défaut
createsuperuser --noinput
commande et définir tous les champs obligatoires (y compris le mot de passe) comme variables d'environnementDJANGO_SUPERUSER_PASSWORD
,DJANGO_SUPERUSER_USERNAME
,DJANGO_SUPERUSER_EMAIL
par exemple.--noinput
drapeau est requis.Cela vient des documents originaux: https://docs.djangoproject.com/en/3.0/ref/django-admin/#django-admin-createsuperuser
et je viens de vérifier - cela fonctionne. Vous pouvez désormais exporter facilement ces variables d'environnement et les ajouter
createsuperuser
à vos scripts et pipelines.la source
Vous pouvez écrire un simple script python pour gérer l'automatisation de la création des super-utilisateurs. Le
User
modèle est juste un modèle Django normal, vous suivrez donc le processus normal d'écriture d'un script Django autonome. Ex:Vous pouvez également passer
createsuperuser
quelques options, à savoir--noinput
et--username
, qui vous permettraient de créer automatiquement de nouveaux super-utilisateurs, mais ils ne pourraient pas se connecter tant que vous ne leur aurez pas défini un mot de passe.la source
cretesuperuser
, mais comment définir le mot de passe alors? Je voudrais faire cela dans un script bash ...Réponse la plus votée actuelle:
Une version améliorée serait:
la source
if not User.objects.filter(username = username).exists()
,Documentation de la commande createuser
la source
noinput
drapeau avec d'autres paramètres:DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email [email protected] --noinput
J'ai utilisé une doublure Tk421 mais j'ai reçu un message d'erreur comme: 1) Je pense que j'utilise une version ultérieure de Django (1.10)
Manager isn't available; 'auth.User' has been swapped for 'users.User'
2) l'ordre des paramètres à create_superuser était incorrect.Alors je l'ai remplacé par:
et ce qui me plaît vraiment, c'est que cela fonctionne également sur un déploiement heroku:
Cela fonctionnera bien à plusieurs reprises. Je l'utilise au début d'un projet, alors ne vous inquiétez pas des terribles suppressions en cascade qui pourraient survenir plus tard.
J'ai revisité après quelques problèmes avec l'exécution de ceci dans local () à partir de fabric. ce qui semblait se passer, c'est que le symbole du tuyau signifiait qu'il était interprété localement plutôt que sur heroku. Pour trier cela, j'ai enveloppé la commande entre guillemets. Ensuite, j'ai dû utiliser des guillemets doubles triples pour les chaînes python à l'intérieur des guillemets simples de toute la commande python.
la source
Une solution basée sur l' approche d' Adam Charnock ci - dessus est désormais disponible sous forme de package Python. Cela prend trois étapes:
Installer:
pip install django-createsuperuserwithpassword
Activer:
INSTALLED_APPS += ("django_createsuperuserwithpassword", )
Appliquer:
C'est tout.
la source
très facile, écoutez le signal post-syncdb et lisez les informations d'identification du super-utilisateur à partir d'un fichier de configuration et appliquez-le.
la source
Ce petit script python pourrait créer un utilisateur normal ou un superutilisateur
--superuser & --password ne sont pas obligatoires.
Si --superuser n'est pas défini, l'utilisateur normal sera créé Si --password n'est pas défini, un mot de passe aléatoire sera généré
la source
C'est ce que j'ai bricolé pour Heroku post_deploy et une variable app.json prédéfinie :
Avec cela, vous pouvez avoir une seule variable d'environnement:
J'aime l' option shell --command , mais je ne sais pas comment obtenir le caractère de nouvelle ligne dans le script de commande. Sans la nouvelle ligne, l'
if
expression entraîne une erreur de syntaxe.la source
Accédez à l'invite de commande et tapez:
si la migration n'a pas été exécutée, allez dans le dossier de l'application django et exécutez ce qui suit
puis bingo.
la source
la source
Avec shell_plus, c'est beaucoup plus facile en fait
Comme d'autres l'ont mentionné, avec Django 3.0, vous pouvez transmettre les informations d'identification via des variables d'environnement. Cependant, cette approche est beaucoup plus flexible car elle vous permet d'effectuer toute autre tâche plus compliquée comme la suppression de tous les utilisateurs de tests, etc.
la source