Question Créer automatiquement un utilisateur admin lors de l'exécution de Django ./manage.py syncdb


Mon projet est en développement précoce. Je supprime fréquemment la base de données et lance manage.py syncdb pour configurer mon application à partir de zéro.

Malheureusement, cela apparaît 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 avez ensuite fourni un nom d'utilisateur, une adresse e-mail valide et un mot de passe. C'est fastidieux. Je me lasse de taper test\nx@x.com\ntest\ntest\n.

Comment puis-je automatiquement ignorer cette étape et créer un utilisateur par programmation lors de l'exécution manage.py syncdb ?


78
2017-09-23 15:40


origine


Réponses:


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 le superutilisateur créé:

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

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

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

Vous pouvez ensuite ajouter les informations de session au vidage du module auth (et probablement augmenter la date d'expiration afin qu'il n'expire 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 invite interactive vous demandant un super-utilisateur.


77
2018-03-25 14:08



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

Cela le fera pour vous en une seule ligne (par application):

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

La première commande examinera votre application et générera le code SQL requis pour supprimer les tables. Cette sortie est ensuite redirigée vers le dbshell pour l'exécuter.

Après cela, exécutez votre syncdb pour recréer les tables:

python manage.py syncdb

49
2017-09-23 15:46



La clé est d'utiliser --noinput au moment de syncdb et ensuite utiliser cette one liner 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/


27
2018-06-05 19:25



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

django/contrib/auth/management/__init__.py

pour voir comment l'enregistrement de la fonction superutilisateur est effectué. J'ai trouvé que je pouvais inverser cette inscription, et ne jamais être posé la question pendant "syncdb", si j'ai placé ce code dans mes "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 sais pas comment garantir que ce code est exécuté après le code Django qui effectue l'enregistrement. Je pensais que cela dépendrait si votre application ou l'application django.contrib.auth était mentionnée en premier dans INSTALLED_APPS, mais cela semble fonctionner pour moi, quel que soit l'ordre dans lequel je les ai mis. Heureusement que le nom de mon application commence par une lettre plus tard que "d"? Ou est-ce que Django est juste assez intelligent pour faire ses propres choses en premier, puis le mien au cas où je voudrais rater leurs réglages? Fais moi signe si tu trouves. :-)


16
2017-10-13 15:35



J'ai surmonté cette fonctionnalité en utilisant Sud

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

South est un outil conçu pour faciliter la migration des modifications vers le site en direct sans détruire la structure des informations ou de la base de données. Les changements résultants peuvent être suivis par le sud et en utilisant les fichiers python générés - peuvent effectuer les mêmes actions sur une base de données alternative.

Au cours du développement, j'utilise cet outil pour suivre les modifications de ma base de données et pour apporter des modifications à la base de données sans avoir à la détruire en premier.

  1. easy_install south
  2. Ajouter 'sud' à vos applications installées

Proposer la première course du sud sur une application.

$ python manage.py schemamigration appname --init

Cela initiera la détection de schéma sur cette application.

$ python manage.py migrate appname

Cela appliquera les modifications du modèle

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

Changer 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. Plus sud fait beaucoup plus ...


11
2017-07-16 21:49



Note: depuis la version 1.7 syncdb commande est déconseillé. Utilisation migrate  au lieu.

Aussi Django 1.7 introduit AppConfig comme moyen de personnaliser le processus d'initialisation des applications.

Ainsi, depuis Django 1.7, le moyen le plus simple de réaliser ce que vous voulez est d’utiliser un AppConfigla sous-classe

Disons que vous avez votre propre example_app qui est ajouté à votre INSTALLED_APPS et vous voulez créer et admin utilisateur avec admin mot de passe chaque fois que vous exécutez ./manage.py migrate à partir de rien. Je suppose également que la création automatique d’administrateur est requise uniquement dans dev environnement - pas en production.

Ajoutez le code suivant à example_app/config.py

# example_app/config.py

from django.apps import AppConfig
from django.conf import settings
from django.contrib.auth.management.commands import createsuperuser
from django.db.models import signals
from django.contrib.auth.models import User


USERNAME = "admin"
PASSWORD = "admin"


class ExampleAppConfig(AppConfig):
name = __package__

def ready(self):
    if not settings.DEBUG:
        return

    from django.contrib.auth import models as auth_models

    def create_testuser(**kwargs):
        User = auth_models.User
        manager = User.objects
        try:
            manager.get(username=USERNAME)
        except User.DoesNotExist:
            manager.create_superuser(USERNAME, 'x@x.com', PASSWORD)

    # Prevent interactive question about wanting a superuser created
    signals.post_migrate.disconnect(createsuperuser, sender=auth_models,
        dispatch_uid='django.contrib.auth.management.create_superuser')
    signals.post_migrate.connect(create_testuser, sender=auth_models,
        dispatch_uid='common.models.create_testuser')

Ajoutez également la référence suivante à la configuration de l'application dans les applications example_app/__init__.py:

# example_app/__init__.py

default_app_config = 'example_app.config.ExampleAppConfig'

Où default_app_config est un chemin de chaîne Python vers le AppConfig sous-classe comme mentionné ici.


7
2018-01-03 17:09



le manage.py reset La commande réinitialisera votre base de données sans détruire votre super utilisateur créé. Les données doivent cependant être réimportées.


5
2018-02-08 12:40