Crear automáticamente una administración de usuario cuando se ejecuta Django es ./manage.py syncdb

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

Pregunta

Mi proyecto está en desarrollo temprano.Me frecuentemente eliminar la base de datos y ejecutar manage.py syncdb para configurar mi aplicación desde cero.

Por desgracia, este siempre aparece:

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): 

Entonces usted tiene suministrar un nombre de usuario, dirección de correo electrónico válida y una contraseña.Esto es tedioso.Me estoy cansando de escribir test\nx@x.com\ntest\ntest\n.

¿Cómo puedo automáticamente omita este paso y crear un usuario mediante programación cuando se ejecuta manage.py syncdb ?

¿Fue útil?

Solución

Sé que la pregunta se ha respondido ya, pero ...

Un enfoque mucho más simple es para volcar los datos del módulo de autenticación en un archivo JSON vez que se haya creado el superusuario:

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

También puede volcar los datos de las sesiones:

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

A continuación, puede añadir la información de la sesión al vertedero módulo de autenticación (y probablemente aumentará la EXPIRE_DATE por lo que no caduca nunca ...; -).

A partir de entonces, puede utilizar

/manage.py syncdb --noinput

para cargar el superusuario y su sesión al crear la base de datos sin intérprete interactivo que le pregunta acerca de un superusuario.

Otros consejos

En lugar de borrar toda la base de datos, basta con borrar las tablas de su aplicación antes de ejecutar el syncdb

Esto logrará para usted en una sola línea (por aplicación):

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

El primer comando se verá en su aplicación y generar el código SQL necesario para eliminar las tablas. Esta salida se canaliza al dbshell para ejecutarlo.

Después de su hacer, ejecutar su syncdb para recrear las tablas:

python manage.py syncdb

La clave es usar --noinput en el momento de syncdb y luego usar este one liner para crear superusuario

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

Crédito: http://source.mihelac.org/ 2009/10/23 / django-evitar-escribiendo-contraseña de superusuario /

Si desea que la capacidad - como yo - para comenzar realmente con una base de datos fresca sin ser superusuario hizo esa pregunta, entonces usted puede simplemente cancelar el registro del manejador de la señal que hace esa pregunta. Echa un vistazo a la parte inferior del archivo:

django/contrib/auth/management/__init__.py

para ver cómo se lleva a cabo el registro de la función de superusuario. Me di cuenta que podía revertir este registro, y nunca se hizo la pregunta durante la "syncdb", si pusiera este código en mi "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")

No estoy seguro de cómo garantizar que este código se ejecute después el código de Django que hace el registro. Yo había pensado que dependería de si la aplicación o la aplicación django.contrib.auth consigue menciona por primera vez en INSTALLED_APPS, pero parece que funciona para mí, independientemente del orden en que los puse. Tal vez se hacen por orden alfabético y estoy de suerte que el nombre de mi aplicación se inicia con una carta a más tardar "d"? O es Django simplemente lo suficientemente inteligente como para hacer su propio material en primer lugar, a continuación, en el caso de la mina Quiero lodo con su configuración? Avísame si lo descubres. : -)

He superado esta función mediante sur

Es un debe tener para cualquier desarrollador Django.

Sur es una herramienta diseñada para ayudar a migrar cambios hacia el sitio en producción sin destruir información o estructura de base de datos. Los cambios resultantes pueden ser rastreados por el sur y el uso de los archivos generados pitón - puede realizar las mismas acciones en una base de datos alternativa

.

Durante el desarrollo, que utilizan esta herramienta para realizar un seguimiento de GIT mis cambios de bases de datos -. Y para hacer un cambio en la base de datos sin la necesidad de destruir primero

  1. easy_install sur
  2. Añadir 'sur' de sus aplicaciones instaladas

Proponer primer tiempo de ejecución del sur en una aplicación.

$ python manage.py schemamigration appname --init

Esto iniciará la detección esquema en esa aplicación.

$ python manage.py migrate appname

Esto permite aplicar los cambios en el modelo

  • La base de datos tendrá los nuevos modelos.

Cambio de un modelo después de la primera carrera

$ python manage.py schemamigration appname --auto

$ python manage.py migrate appname


Los modelos se han cambiado - los datos no se destruye. Más al sur hace mucho más ...

Nota:desde la versión 1.7 syncdb el comando es obsoleto.Uso migrate en su lugar.

También Django 1.7 introducido AppConfig como medio de la personalización de las aplicaciones " en el proceso de inicialización.

Por lo tanto desde Django 1.7 la manera más simple de lograr lo que desea es emplear un AppConfig's de la subclase.

Vamos a decir, usted tiene su propio example_app que se agrega a su INSTALLED_APPS y desea crear y admin usuario con admin la contraseña cada vez que se ejecuta ./manage.py migrate a partir de cero.También asumo que la administración en la creación del usuario sólo es necesaria en dev medio ambiente, y no en la producción.

Agregue el código siguiente 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)

También agrega la siguiente referencia a la aplicación de configuración dentro de aplicaciones example_app/__init__.py:

# example_app/__init__.py

default_app_config = 'example_app.apps.ExampleAppConfig'

Donde el default_app_config es una cadena de Python ruta de acceso a la AppConfig subclase como se mencionó aquí.

El comando manage.py reset se restablecerá su base de datos sin destruir su super usuario creado. Datos embargo, no necesita ser re-importado.

Puede utilizar django-finalware para hacer esto para usted . Sólo tiene que añadir a su finalware INSTALLED_APPS e incluya lo siguiente en su 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'

A continuación, basta con ejecutar ./manage.py syncdb (Django <1,7) o ./manage.py migrate (Django> = 1,7), y se creará automáticamente un superusuario o actualizar la existente para usted.

Nunca se le pide que creó un superusuario más.

Desde Django 1.7 de la manera propuesta de poblar la base de datos es a través de las migraciones de datos. Para crear una migración de datos para crear el administrador debe crear primero una migración vacío:

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

Esto creará una migración vacía en myapp/migrations/000x__create-superuser.py. Editar el archivo para que se vea como esto:

# -*- 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)]

He resuelto la creación de un script en Python como éste para restablecer todas mis cosas [versión actualizada] [1.8 también]:

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()

funciona como un encanto!

P.S .: Asegúrese de parar el servidor (pruebas), donde por encima de db es el encargado antes de ejecutar este script!

Tome un vistazo a la instrucción de gestión dumpdata. Por ejemplo:

python manage.py dumpdata > initial_data.json

Si este archivo, llamado un accesorio, es nombrado initial_data (.xml o .json), entonces el comando syncdb lo recogerá y poblar las tablas en consecuencia. Todavía le preguntará si desea crear un usuario, pero creo que es posible responder de manera segura "no", después del cual se va a poblar la base de datos sobre la base de su accesorio.

Más información sobre este se puede encontrar en el documentos .

Desarrollo con SQLite. Borrar la base de datos por borrar el archivo. Carga de administración de los accesorios.

cambio manage.py (django 1.4):

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

Mi solución a esto fue simplemente no eliminar que las tablas de autenticación cuando se limpia a cabo mi base de datos.

Si prefiere escribir código de inicialización directa en el archivo de origen pitón, el código modificado manage.py podría ayudar (y gracias por poco código 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

Sólo estoy mostrando el código de creación de usuario aquí, pero se puede mejorar este código sea más como desee.

Estoy usando una base de datos SQLite como prog. Después de cambiar las clases del modelo, simplemente elimine las tablas correspondientes con Gestor de sqlite (un plugin de Firefox, abierta para inspeccionar los datos de todos modos) y ejecutar manage.py syncdb para recrear lo que falta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top