Crear automáticamente una administración de usuario cuando se ejecuta Django es ./manage.py syncdb
-
13-09-2019 - |
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
?
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
- easy_install sur
- 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.