83 votes

Création automatique d'un utilisateur administrateur lors de l'exécution de la commande ./manage.py syncdb de Django

Mon projet est en phase de développement précoce. Je supprime fréquemment la base de données et j'exécute manage.py syncdb pour mettre en place mon application à partir de zéro.

Malheureusement, cela se produit toujours :

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): 

Vous devez ensuite fournir un nom d'utilisateur, une adresse électronique valide et un mot de passe. C'est fastidieux. Je commence à en avoir assez de taper test\nx@x.com\ntest\ntest\n .

Comment puis-je sauter automatiquement cette étape et créer un utilisateur de manière programmatique lors de l'exécution de l'application manage.py syncdb ?

0 votes

syncdb a été déprécié au profit des migrations de données

80voto

philgo20 Points 1266

Je sais que la question a déjà reçu une réponse, mais...

Une approche beaucoup plus simple consiste à vider les données du module d'authentification dans un fichier json une fois que le superutilisateur a été créé :

 ./manage.py dumpdata --indent=2 auth > initial_data.json

Vous pouvez également vider les données des sessions :

./manage.py dumpdata --indent=2 sessions

Vous pouvez alors ajouter les informations de session au dump du module auth (et probablement augmenter la date d'expiration pour qu'elle n'expire pas... jamais ;-).

A partir de là, vous pouvez utiliser

/manage.py syncdb --noinput

pour charger le super-utilisateur et sa session lors de la création de la base de données, sans qu'une invite interactive ne vous demande de désigner un super-utilisateur.

1 votes

Cela devrait vraiment être la réponse acceptée. C'est la plus simple. Le lien est cassé :(

4 votes

Où je dois mettre initial_data.json de sorte que syncdb le trouve ? Les docs dit : "Dans le répertoire de fixation de chaque application installée" . Est-ce que c'est par exemple ./eggs/Django-1.6.5-py2.7.egg/django/contrib/auth/fixtures ?

2 votes

Cette fonction est obsolète depuis Django 1.7 : docs.djangoproject.com/fr/1.7/howto/initial-data/ Vous pouvez maintenant utiliser les migrations de données.

49voto

Andre Miller Points 6713

Au lieu de supprimer la totalité de votre base de données, supprimez simplement les tables de votre application avant d'exécuter la commande syncdb.

Cela vous permettra de le faire en une seule ligne (par application) :

python manage.py sqlclear appname | python manage.py dbshell

La première commande va regarder votre application et générer le SQL nécessaire pour supprimer les tables. Cette sortie est ensuite envoyée au dbshell pour l'exécuter.

Une fois que c'est fait, exécutez votre syncdb pour recréer les tables :

python manage.py syncdb

2 votes

J'aime cette réponse. Merci pour la suggestion !

0 votes

Moi aussi, merci ! solution propre, je l'utilise déjà pour avoir un dump propre que je syncdb quand j'en ai besoin.

29voto

buffer Points 2261

La clé est d'utiliser --noinput au moment de syncdb & ensuite utiliser ceci one liner pour créer un superutilisateur

echo "from django.contrib.auth.models import User; User.objects.create_superuser('myadmin', 'myemail@example.com', 'hunter2')" | python manage.py shell

Crédit : http://source.mihelac.org/2009/10/23/django-avoiding-typing-password-for-superuser/

5 votes

Merci ! C'est plus clair que les autres, plus robuste et extensible, et idéal pour l'utilisation du première fois vous exécutez votre code, ainsi que dans les scripts de test et certains scénarios de déploiement, et bien sûr pour le scénario de développement qui a conduit à la question.

16voto

Brandon Rhodes Points 21188

Si, comme moi, vous voulez pouvoir commencer avec une nouvelle base de données sans avoir à répondre à la question du superutilisateur, vous pouvez simplement désenregistrer le gestionnaire de signaux qui pose cette question. Regardez tout en bas du fichier :

django/contrib/auth/management/__init__.py

pour voir comment l'enregistrement de la fonction de super-utilisateur est effectué. J'ai découvert que je pouvais inverser cet enregistrement, et ne jamais me faire poser la question pendant "syncdb", si je plaçais ce code dans mon "models.py" :

from django.db.models import signals
from django.contrib.auth.management import create_superuser
from django.contrib.auth import models as auth_app

# Prevent interactive question about wanting a superuser created.  (This
# code has to go in this otherwise empty "models" module so that it gets
# processed by the "syncdb" command during database creation.)

signals.post_syncdb.disconnect(
    create_superuser,
    sender=auth_app,
    dispatch_uid = "django.contrib.auth.management.create_superuser")

Je ne suis pas sûr de savoir comment garantir que ce code est exécuté après le code Django qui effectue l'enregistrement. J'avais pensé que cela dépendrait du fait que votre application ou l'application django.contrib.auth soit mentionnée en premier dans INSTALLED_APPS, mais cela semble fonctionner pour moi quel que soit l'ordre dans lequel je les place. Peut-être que l'ordre est alphabétique et que j'ai de la chance que le nom de mon application commence par une lettre après "d" ? Ou Django est-il simplement assez intelligent pour faire ses propres choses d'abord, puis les miennes au cas où je voudrais toucher à leurs paramètres ? Faites-moi savoir si vous trouvez la réponse :-)

0 votes

J'ai finalement implémenté ceci et ajouté un hook pour créer mon propre utilisateur de test (si settings.DEBUG es True ) automatiquement. Merci encore !

11voto

Glycerine Points 3526

J'ai surmonté cette fonctionnalité en utilisant sud

C'est un must pour tout développeur django.

South est un outil conçu pour aider à migrer les changements vers le site réel sans détruire les informations ou la structure de la base de données. Les changements qui en résultent peuvent être suivis par South et, grâce aux fichiers python générés, il est possible d'effectuer les mêmes actions sur une autre base de données.

Pendant le développement, j'utilise cet outil pour faire le suivi git des modifications apportées à ma base de données - et pour apporter une modification à la base de données sans avoir à la détruire au préalable.

  1. easy_install south
  2. Ajoutez "sud" à vos applications installées

Proposer la première exécution du sud sur une application.

$ python manage.py schemamigration appname --init

Cela déclenchera la détection des schémas sur cette application.

$ python manage.py migrate appname

Ceci appliquera les changements de modèle

  • La base de données contiendra les nouveaux modèles.

Modification d'un modèle après la première exécution

$ python manage.py schemamigration appname --auto

$ python manage.py migrate appname


Les modèles auront changé - les données ne sont pas détruites. De plus, le sud fait beaucoup plus...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X