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

Mon projet est en développement précoce. Je supprime fréquemment la firebase database et exécute 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. J’en ai assez de taper test\[email protected]\ntest\ntest\n .

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

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 append 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 firebase database sans invite interactive vous demandant un super-utilisateur.

Au lieu de supprimer toute votre firebase database, 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 requirejs 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 

La clé est d’utiliser --noinput au moment de syncdb et d’utiliser ensuite ce one liner pour créer un superutilisateur

 echo "from django.consortingb.auth.models import User; User.objects.create_superuser('myadmin', '[email protected]', 'hunter2')" | python manage.py shell 

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

Si vous voulez avoir la possibilité – comme moi – de commencer avec une nouvelle firebase database 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/consortingb/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.consortingb.auth.management import create_superuser from django.consortingb.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.consortingb.auth.management.create_superuser") 

Je ne sais pas comment garantir que ce code est exécuté après le code Django qui effectue l’inscription. J’avais pensé que cela dépendrait si votre application ou l’application django.consortingb.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. 🙂

J’ai surmonté cette fonctionnalité en utilisant le 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 firebase database. 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 firebase database alternative.

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

  1. easy_install south
  2. Ajouter ‘south’ à 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 firebase database 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 …

Remarque: depuis la version 1.7, la commande syncdb est obsolète . Utilisez plutôt la migrate .

De même, Django 1.7 a introduit AppConfig comme moyen de personnaliser le processus d’initialisation des applications.

Ainsi, depuis Django 1.7, le moyen le plus simple d’obtenir ce que vous voulez consiste à utiliser une sous-classe d’ AppConfig .

Disons que vous avez votre propre example_app qui est ajouté à votre INSTALLED_APPS et que vous voulez créer un utilisateur admin avec un mot de passe administrateur chaque fois que vous exécutez ./manage.py migrate de zéro. Je suppose également que la création automatique d’administrateur est requirejse uniquement dans l’environnement de développement – et non 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.consortingb.auth.management.commands import createsuperuser from django.db.models import signals from django.consortingb.auth.models import User USERNAME = "admin" PASSWORD = "admin" class ExampleAppConfig(AppConfig): name = __package__ def ready(self): if not settings.DEBUG: return from django.consortingb.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, '[email protected]', PASSWORD) # Prevent interactive question about wanting a superuser created signals.post_migrate.disconnect(createsuperuser, sender=auth_models, dispatch_uid='django.consortingb.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 apps 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 la sous-classe AppConfig comme mentionné ici .

La commande de manage.py reset votre firebase database sans détruire votre super utilisateur créé. Les données doivent cependant être réimscopes.

Vous pouvez utiliser django-finalware pour le faire pour vous. Ajoutez simplement le finalware à votre INSTALLED_APPS et incluez les éléments suivants dans vos settings.py :

 SITE_SUPERUSER_USERNAME = 'myadmin' SITE_SUPERUSER_EMAIL = '[email protected]' SITE_SUPERUSER_PASSWORD = 'mypass' # this can be set from a secret file. # optional object id. Ensures that the superuser id is not set to `1`. # you can use this as a simple security feature SITE_SUPERUSER_ID = '343' 

Ensuite, exécutez simplement ./manage.py syncdb (Django <1.7) ou ./manage.py migrate (Django> = 1.7), qui créera automatiquement un superutilisateur ou mettra à jour celui existant pour vous.

Vous n’êtes jamais invité à créer un superutilisateur.

Depuis Django 1.7, le moyen suggéré de remplir la firebase database consiste à effectuer des migrations de données. Pour créer une migration de données pour créer l’administrateur, vous devez d’abord créer une migration vide:

./manage.py makemigrations --empty myapp --name create-superuser

Cela créera une migration vide dans myapp/migrations/000x__create-superuser.py . Editez le fichier pour qu’il ressemble à ceci:

 # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations, models from django.consortingb.auth.models import User def create_superuser(apps, schema_editor): User.objects.create_superuser(username='myadmin', password='mypassword', email='[email protected]') class Migration(migrations.Migration): dependencies = [('myapp', '000y_my-previous-migration-file'),] operations = [migrations.RunPython(create_superuser)] 

J’ai résolu de créer un script python comme celui-ci pour réinitialiser tous mes éléments [version mise à jour] [1.8 également]:

 import os import sys os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main.settings.dev") from django.conf import settings from django.core import management from django import get_version PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) if PROJECT_ROOT not in sys.path: sys.path.append(PROJECT_ROOT) yn = raw_input('Are you sure you want to reset everything? (y/n) ') if yn == 'y': # Drops the db / creates the db if settings.DATABASES['default']['ENGINE'].find('mysql') != -1: os.system('mysqladmin -uroot -pIronlord0 -f drop db') os.system('mysqladmin -uroot -pIronlord0 -f create db') elif settings.DATABASES['default']['ENGINE'].find('psycopg2') != -1: os.system('psql -U postgres -c "DROP DATABASE db"') os.system('psql -U postgres -c "CREATE DATABASE db WITH OWNER = admin"') elif settings.DATABASES['default']['ENGINE'].find('sqlite3') != -1: try: os.remove(os.path.join(PROJECT_ROOT, 'data.db')) except: pass # Getting application handle here otherwise db gets allocated and it can not be destroyed. if get_version() > '1.6.10': from django.core.wsgi import get_wsgi_application application = get_wsgi_application() management.call_command('syncdb', interactive=False) # Creates admin/password from django.consortingb.auth.management.commands import changepassword management.call_command('createsuperuser', interactive=False, username="admin", email="[email protected]") command = changepassword.Command() command._get_pass = lambda *args: 'password' if get_version() >= '1.8': command.execute(username="admin") else: command.execute("admin") # Creates the default site entry from django.consortingb.sites.models import Site site = Site.objects.get_current() site.domain = 'www.example.com' site.name = ' xxx ' site.save() 

il fonctionne comme un charme!

PS: veillez à arrêter votre serveur (de test) où db est en charge avant d’exécuter ce script!

Jetez un oeil à la commande de gestion dumpdata . Par exemple:

 python manage.py dumpdata > initial_data.json 

Si ce fichier, appelé fixture, s’appelle initial_data (.xml ou .json), la commande syncdb la syncdb remplira vos tables en conséquence. Il vous demandera toujours si vous souhaitez créer un utilisateur, mais je pense que vous pouvez répondre “non” en toute sécurité, après quoi il remplira la firebase database en fonction de votre appareil.

Plus d’informations à ce sujet peuvent être trouvées dans les documents .

Développer avec sqlite. Effacer la firebase database en supprimant le fichier. Chargez les administrateurs depuis les appareils.

changer manage.py (django 1.4):

 # hack to prevent admin promt if len(sys.argv) == 2 and sys.argv[1] == 'syncdb': sys.argv.append('--noinput') 

Ma solution était de ne pas supprimer ces tables lors de la suppression de ma firebase database.

Si vous préférez taper du code d’initialisation directement dans le fichier source python, ce code modifié manage.py pourrait vous aider (et merci pour le petit code de Cjkjvfnby!):

 #!/usr/bin/env python import os import sys if __name__ == "__main__": # set your django setting module here os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") from django.core.management import execute_from_command_line # hack to prevent admin prompt if len(sys.argv) == 2 and sys.argv[1] == 'syncdb': sys.argv.append('--noinput') execute_from_command_line(sys.argv) # additional process for creation additional user, misc data, and anything for arg in sys.argv: # if syncdb occurs and users don't exist, create them if arg.lower() == 'syncdb': print 'syncdb post process...' from django.consortingb.auth.models import User admin_id = 'admin' admin_email = '[email protected]' admin_password = 'superuser_password' additional_users = [ ['tempuser', '[email protected]', 'tempuser_password'] ] # admin exists? user_list = User.objects.filter(username=admin_id) if len(user_list) == 0: print 'create superuser: ' + admin_id new_admin = User.objects.create_superuser(admin_id, admin_email, admin_password) # additional user exists? for additional_user in additional_users: user_list = User.objects.filter(username=additional_user[0]) if len(user_list) == 0: print 'create additional user: ' + additional_user[0] new_admin = User.objects.create_user(additional_user[0], additional_user[1], additional_user[2]) # any other data 

Je ne fais que montrer le code de création de l’utilisateur ici, mais vous pouvez améliorer ce code comme vous le souhaitez.

J’utilise sqlite comme firebase database de développement. Après avoir modifié les classes de modèle, déposez simplement les tables correspondantes avec sqlite manager (un plugin firefox, ouvrez-les pour inspecter les données de toute façon) et exécutez manage.py syncdb pour recréer ce qui manque.