Créer un super utilisateur Django sans prompt


Automatiser le déploiement d’un projet Django passe par un syncdb sans prompt, et donc pas de création de superutilisateur :

./manage.py syncdb --noinput

Vous pouvez bien entendu toujours en créer un plus tard, avec :

./manage.py createsuperuser --username=vous --email=votre_mail

Mais il va vous prompter pour saisir le mot de passe ou alors mettre un mot de passe inutilisable automatiquement, ça ne résout pas votre problème. Une astuce consiste à le créer avec un code Python et à piper ce code dans un shell :

echo "from django.contrib.auth.models import User; User.objects.filter(username='vous').count() or User.objects.create_superuser('vous', votre_email', 'mot_de_passe')" | ./manage.py shell

Personnellement je colle ça dans une tache fabric. Parfois on peut même générer le mot de passe aléatoirement avec un uuid qui est printé localement.

5 thoughts on “Créer un super utilisateur Django sans prompt

  • Labarbiche

    Personnellement j’utilise la commande runscript de django-extensions pour faire le sale boulot:
    Dans un répertoire scripts/ (à coté de manage.py) je mets un fichier create_admin.py comme ceci:

    from django.contrib.auth.models import User
     
    def run():
    ...if not User.objects.filter(username='sam').count():
    ......print "Creating user sam"
    ......user = User.objects.create_user('sam', 'sam@sametmax.com', 'megapassword')
    ......user.first_name = 'Le'
    ......user.last_name = 'Sam'
    ......user.is_staff = True
    ......user.is_superuser = True
    ......user.save()
     
    ...... (pff pas réussi à mettre du code indenté... j'ai mis des .)

    Ensuite, ./manage.py runscript create_admin

    C’est trés pratique d’ailleurs d’avoir des scripts sous la main de cette manière.

    A mélanger avec ./manage.py syncdb –noinput
    (ah oui, il faut aussi un __init__.py vide dans le répertoire scripts/ )

  • Labarbiche

    Oui tu as raison: une commande django permet de faire plus de choses, comme le parsing d’argument, ne demande pas d’installer de module supplémentaire, et c’est mieux documenté: 3-0 !
    Merci pour l’idée, j’en ferai à l’occasion.

  • Raphi

    Chouette!

    J’avais bidouillé un truc simillaire en fourrant un signal (de mémoire) dans le models.py d’une app fourre tout, ca dépannait mais j’trouvais ca crado.

    J’suis en train d’mettre en place des templates de projets pour le boulot, en jouant avec fabric et cookiecutter, ca marche au poil.

    Après le coup d’la commande django, j’y avais vaguement pensé, ca m’paraissait un peu overkill mais en y réflechissant pourquoi pas, ca peut rendre le fabfile un peu moins crade et s’réutiliser pour des tests à l’arrache… A creuser ^^

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.