Créez automatiquement un administrateur lors de l'exécution de Django ./manage.py syncdb

StackOverflow https://stackoverflow.com/questions/1466827

Question

Mon projet est en début de développement. Supprimer fréquemment la base de données et exécuter 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): 

Ensuite, vous devez fournir un nom d'utilisateur, adresse e-mail et mot de passe. Ceci est fastidieux. Je suis fatigué de taper test\nx@x.com\ntest\ntest\n.

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

Était-ce utile?

La solution

Je sais que la question a été déjà répondu, mais ...

Une approche beaucoup plus simple consiste à vider les données du module auth dans un fichier JSON une fois que le super-utilisateur a été créé:

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

Vous pouvez également transférer 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 expire_date il n'expire pas ... jamais; -).

A partir de là, vous pouvez utiliser

/manage.py syncdb --noinput

pour charger le super-utilisateur et sa séance lors de la création du db sans invite interactive vous poser des questions sur un super-utilisateur.

Autres conseils

Au lieu de supprimer votre base de données, il suffit de supprimer les tables de votre application avant d'exécuter le syncdb

Ceci pour vous accomplir dans une seule ligne (par application):

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

La première commande regardera votre application et générer le SQL requis pour déposer les tables. Cette sortie est ensuite canalisée vers la dbshell pour l'exécuter.

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

python manage.py syncdb

La clé est d'utiliser --noinput au moment de syncdb et utilisez cette one liner pour créer super-utilisateur

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-évitant typage-mot de passe pour superutilisateurs /

Si vous voulez avoir la possibilité - comme je le fais - pour vraiment commencer avec une nouvelle base de données sans se poser cette question super-utilisateur, vous pouvez simplement désenregistrer le gestionnaire de signal qui pose cette question. Consultez le bas du fichier:

django/contrib/auth/management/__init__.py

pour voir comment l'enregistrement de la fonction de super-utilisateur s'effectue. J'ai trouvé que je pouvais inverser cette inscription, et ne sont jamais posé la question au cours de « syncdb », si je placé 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 fait l'enregistrement. Je pensais que cela dépendrait si votre application ou l'application django.contrib.auth obtient d'abord mentionné dans INSTALLED_APPS, mais il semble fonctionner pour moi quel que soit l'ordre que je les mets. Peut-être qu'ils sont faits par ordre alphabétique et je suis la chance que le nom de mon application commence par une lettre au plus tard « d »? Ou est Django juste assez intelligent pour faire ses propres trucs d'abord, puis moi au cas où je veux muck avec leurs paramètres? Faites-le moi savoir si vous trouvez. : -)

J'ai surmonté cette fonctionnalité en utilisant sud

est un must have pour tout développeur de django.

Sud est un outil conçu pour faciliter la migration des changements sur le site en direct sans détruire l'information ou la structure de base de données. Les changements qui en résultent peuvent être suivis par le sud et en utilisant les fichiers python générés - peuvent effectuer les mêmes actions sur une autre base de données

.

Au cours du développement, j'utiliser cet outil pour suivre git mes changements de base de données -. Et de faire un changement à la base de données sans qu'il soit nécessaire de le détruire premier

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

première manche de proposer du temps au sud sur une application.

$ python manage.py schemamigration appname --init

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

$ python manage.py migrate appname

appliquera les modifications du modèle

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

Modification d'un modèle après la première manche

$ python manage.py schemamigration appname --auto

$ python manage.py migrate appname


modèles ont changé - les données ne sont pas détruites. De plus au sud fait bien plus ...

Note: depuis la version 1.7 commande syncdb est dépréciée . Utilisez migrate au lieu .

Django également 1.7 introduit AppConfig comme un moyen de personnalisation du processus d'initialisation de l'application.

Ainsi depuis Django 1.7 la façon la plus simple pour obtenir ce que vous voulez est d'utiliser la sous-classe d'un AppConfig.

Disons que, vous arrive d'avoir votre propre example_app qui est ajouté à votre INSTALLED_APPS et que vous voulez créer et admin utilisateur admin Mot de passe chaque fois que vous exécutez ./manage.py migrate à partir de zéro . Je suppose également que la création d'utilisateur admin automatique est nécessaire que dans dev environnement -. Pas dans production

Ajoutez le code suivant à example_app/apps.py

# example_app/apps.py

from django.apps import AppConfig
from django.conf import settings
from django.db.models.signals import post_migrate
from django.contrib.auth.apps import AuthConfig


USERNAME = "admin"
PASSWORD = "admin"


def create_test_user(sender, **kwargs):
    if not settings.DEBUG:
        return
    if not isinstance(sender, AuthConfig):
        return
    from django.contrib.auth.models import User
    manager = User.objects
    try:
        manager.get(username=USERNAME)
    except User.DoesNotExist:
        manager.create_superuser(USERNAME, 'x@x.com', PASSWORD)


class ExampleAppConfig(AppConfig):
    name = __package__

    def ready(self):
        post_migrate.connect(create_test_user)

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

# example_app/__init__.py

default_app_config = 'example_app.apps.ExampleAppConfig'

Lorsque le default_app_config est un chemin de python de chaîne à la sous-classe AppConfig comme mentionné ici .

La commande manage.py reset va réinitialiser votre base de données sans détruire votre super-utilisateur créé. Les données ne doivent cependant être réimportés.

Vous pouvez utiliser django-finalware pour le faire pour vous . Il suffit d'ajouter à votre finalware INSTALLED_APPS et comprennent les éléments suivants dans votre settings.py:

SITE_SUPERUSER_USERNAME = 'myadmin'
SITE_SUPERUSER_EMAIL = 'myadmin@example.com'
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, il suffit d'exécuter ./manage.py syncdb (Django <1.7) ou ./manage.py migrate (Django> = 1.7), et il crée automatiquement un super-utilisateur ou mettre à jour l'un pour vous existant.

Vous n'êtes jamais invité à créer une super-utilisateur plus.

Depuis Django 1.7 la manière suggérée de peupler la base de données des migrations de données. Pour créer une migration de données pour la création de l'administrateur, vous devez d'abord créer une migration vide:

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

Cela va créer une migration vide myapp/migrations/000x__create-superuser.py. Modifiez le fichier pour la faire ressembler à ceci:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models
from django.contrib.auth.models import User


def create_superuser(apps, schema_editor):
    User.objects.create_superuser(username='myadmin', password='mypassword', email='myemail@gmail.com')


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 toutes mes affaires [version mise à jour] [1.8 trop]:

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.contrib.auth.management.commands import changepassword
    management.call_command('createsuperuser', interactive=False, username="admin", email="xxx@example.com")
    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.contrib.sites.models import Site
    site = Site.objects.get_current()
    site.domain = 'www.example.com'
    site.name = ' xxx '
    site.save()

il fonctionne comme un charme!

P.S .: Assurez-vous d'arrêter votre serveur (test) où db ci-dessus est en charge avant d'exécuter ce script!

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

python manage.py dumpdata > initial_data.json

Si ce fichier, appelé un appareil, est nommé initial_data (.xml ou .json), puis la commande syncdb va le ramasser et remplir vos tables en conséquence. Il sera toujours vous demander si vous voulez créer un utilisateur, mais je crois que vous pouvez en toute sécurité répondre « non », après quel point il remplira la base de données en fonction de votre appareil.

Plus d'infos sur ce qui peut être trouvé dans le docs .

Développer avec SQLite. Effacer base de données par la suppression du fichier. Charge admin des appareils.

manage.py changement (django 1,4):

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

Ma solution à c'était tout simplement pas supprimer que les tables auth lors du nettoyage ma base de données.

Si vous préférez taper le code d'initialisation directe dans le fichier source python, ce code modifié manage.py pourrait aider (et merci 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.contrib.auth.models import User

            admin_id = 'admin'
            admin_email = 'superuser@mail.com'
            admin_password = 'superuser_password'
            additional_users = [
                                ['tempuser', 'user_email@mail.com', '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 suis juste montrer le code de création d'utilisateur, mais vous pouvez améliorer ce code plus que vous le souhaitez.

J'utilise SQLite comme base de données de dev. Après avoir changé les classes de modèles, déposez simplement les tables correspondantes avec Gestionnaire de sqlite (un plugin firefox, ouvert pour inspecter les données de toute façon) et exécuter manage.py syncdb pour recréer ce qui manque.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top