Erstellen Sie automatisch einen Administratorbenutzer, wenn Sie Django's ./Manage.py SyncDB ausführen

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

Frage

Mein Projekt ist in der frühen Entwicklung. Ich lösche die Datenbank häufig und reite aus manage.py syncdb meine App von Grund auf neu einrichten.

Leider taucht dies immer auf:

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

Dann haben Sie einen Benutzernamen, einen gültigen E -Mail -Adress und ein Passwort. Das ist mühsam. Ich werde es leid zu tippen test\nx@x.com\ntest\ntest\n.

Wie kann ich diesen Schritt automatisch überspringen und beim Ausführen ein Benutzerprogramm erstellen? manage.py syncdb ?

War es hilfreich?

Lösung

Ich weiß, dass die Frage bereits beantwortet wurde, aber ...

Ein viel einfacherer Ansatz besteht darin, die Auth -Moduldaten in eine JSON -Datei abzuwerfen, sobald der Superuser erstellt wurde:

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

Sie können auch die Sitzungsdaten abwerfen:

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

Sie können dann die Sitzungsinformationen an das Auth-Modul-Dump anhängen (und wahrscheinlich das Ablauf des Ablaufs erhöhen, sodass sie nicht mehr ablaufen ... jemals ;-).

Von da an können Sie verwenden

/manage.py syncdb --noinput

So laden Sie den Superuser und seine Sitzung beim Erstellen der DB ohne interaktive Eingabeaufforderung, Sie nach einem Superuser zu fragen.

Andere Tipps

Anstatt Ihre gesamte Datenbank zu löschen, löschen Sie einfach die Tabellen Ihrer App, bevor Sie das SyncDB ausführen

Dies wird es für Sie in einer einzigen Zeile (pro App) erfüllen:

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

Der erste Befehl wird in Ihrer App betrachtet und die erforderliche SQL generiert, um die Tabellen fallen zu lassen. Diese Ausgabe wird dann an die DBShell geleitet, um sie auszuführen.

Führen Sie nach dem Abschluss Ihre SyncDB aus, um die Tabellen neu zu erstellen:

python manage.py syncdb

Der Schlüssel ist zu verwenden --noinput Zum Zeitpunkt der Synchronisation und dann verwenden Sie dies one liner Superuser erstellen

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

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

Wenn Sie möchten, dass die Fähigkeit-wie ich-wirklich mit einer frischen Datenbank beginnen kann, ohne diese Superuser-Frage gestellt zu werden, können Sie den Signalhandler, der diese Frage stellt, einfach abmelden. Schauen Sie sich ganz unten in der Datei an:

django/contrib/auth/management/__init__.py

Um zu sehen, wie die Registrierung der Superuser -Funktion ausgeführt wird. Ich stellte fest, dass ich diese Registrierung umkehren konnte und die Frage während "syncdb" niemals gestellt wurde, wenn ich diesen Code in meinen "Models.Py" platzierte:

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

Ich bin mir nicht sicher, wie ich garantieren kann, dass dieser Code ausgeführt wird nach Der Django -Code, der die Registrierung durchführt. Ich hatte gedacht, dass es davon abhängt, ob Ihre App oder die App django.contrib.auth zuerst in installed_apps erwähnt wird, aber es scheint für mich zu funktionieren, unabhängig von der Reihenfolge, in die ich sie gesteckt habe. Vielleicht sind sie alphabetisch gemacht und ich bin Zum Glück beginnt der Name meiner App mit einem Brief später als "D"? Oder ist Django nur klug genug, um zuerst seine eigenen Sachen zu machen, dann meine, falls ich mit ihren Einstellungen muken möchte? Lassen Sie mich wissen, wenn Sie es herausfinden. :-)

Ich habe diese Funktion mithilfe der Funktion überwunden Süden

Es ist ein Muss für jeden Django -Entwickler.

South ist ein Tool, das dazu beitragen soll, Änderungen auf die Live -Website zu migrieren, ohne Informationen oder Datenbankstruktur zu zerstören. Die resultierenden Änderungen können vom Süden verfolgt werden und verwenden die generierten Python -Dateien - können dieselben Aktionen in einer alternativen Datenbank ausführen.

Während der Entwicklung verwende ich dieses Tool, um meine Datenbankänderungen zu verfolgen - und um eine Änderung der Datenbank vorzunehmen, ohne sie zuerst zu zerstören.

  1. Easy_install South
  2. Fügen Sie Ihren installierten Apps 'South' hinzu

Vorschläge für den ersten Mal nach Süden in einer App.

$ python manage.py schemamigration appname --init

Dadurch wird die Schema -Erkennung in dieser App eingeleitet.

$ python manage.py migrate appname

Dadurch werden die Modelländerungen angewendet

  • Die Datenbank wird die neuen Modelle haben.

Ändern eines Modells nach dem ersten Lauf

$ python manage.py schemamigration appname --auto

$ python manage.py migrate appname


Die Modelle haben sich geändert - Daten werden nicht zerstört. Plus South macht viel mehr ...

Hinweis: Seit Version 1.7 syncdb Befehl ist veraltet. Verwenden migrate stattdessen.

Auch Django 1.7 eingeführt AppConfig als Mittel zur Anpassung des Initialisierungsprozesses von Anwendungen.

Daher ist Django 1.7 der einfachste Weg, um das zu erreichen, was Sie wollen, um eine zu verwenden AppConfigSubklasse.

Sagen Sie, Sie haben zufällig Ihre eigenen example_app das wird zu Ihrem hinzugefügt INSTALLED_APPS und du willst erstellen und Administrator Benutzer mit Administrator Passwort, wann immer Sie ausführen ./manage.py migrate von Grund auf neu. Ich gehe auch davon aus, dass automatische Verwaltungsbenutzererstellung nur in erforderlich ist Dev Umwelt - nicht in Produktion.

Fügen Sie den folgenden Code zu hinzu 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)

Fügen Sie auch die folgende Referenz zur App -Konfiguration in Apps hinzu example_app/__init__.py:

# example_app/__init__.py

default_app_config = 'example_app.apps.ExampleAppConfig'

Wobei der Standard -Python -Pfad für default_app_config zum String -Python -Pfad ist AppConfig Unterklasse wie erwähnt hier.

Das manage.py reset Der Befehl setzt Ihre Datenbank zurück, ohne Ihren erstellten Superbenutzer zu zerstören. Die Daten müssen jedoch erneut importiert werden.

Sie können verwenden Django-Finalware Um das für dich zu tun. Einfach hinzufügen finalware zu deinem INSTALLED_APPS und geben Sie Folgendes in Ihre an 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'

Dann renn einfach ./manage.py syncdb (Django <1,7) oder ./manage.py migrate (Django> = 1.7) und erstellt automatisch einen Superuser oder aktualisiert das vorhandene für Sie.

Sie werden nie mehr aufgefordert, einen Superuser mehr zu erstellen.

Seit Django 1.7 ist die vorgeschlagene Art der Datenbank über Datenmigrationen. Um eine Datenmigration zum Erstellen des Administrators zu erstellen, sollten Sie zunächst eine leere Migration erstellen:

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

Dies erzeugt eine leere Migration in myapp/migrations/000x__create-superuser.py. Bearbeiten Sie die Datei, damit sie so aussieht:

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

Ich habe beschlossen, ein Python -Skript wie dieses zu erstellen, um alle meine Sachen zurückzusetzen [aktualisierte Version] [1.8 auch]:

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

es wirkt wie ein Zauber!

PS: Achten Sie darauf, dass Sie Ihren (Test-) Server anhalten, auf dem oben dB verantwortlich ist, bevor Sie dieses Skript ausführen!

Schauen Sie sich das an die dumpdata Verwaltungsbefehl. Zum Beispiel:

python manage.py dumpdata > initial_data.json

Wenn diese Datei, die als Fixture bezeichnet wird, benannt wird initial_data (.xml oder .json), dann die syncdb Der Befehl nimmt es auf und füllt Ihre Tische entsprechend. Es wird Sie weiterhin gefragt, ob Sie einen Benutzer erstellen möchten, aber ich glaube, Sie können sicher "Nein" antworten. Danach wird die Datenbank basierend auf Ihrem Gerät aufgebaut.

Weitere Informationen dazu finden Sie in der Dokumente.

Entwicklung mit SQLite. Datenbank löschen, indem Sie Datei löschen. Laden Sie den Administrator aus den Vorrichtungen.

ändern verwalten.py (django 1.4):

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

Meine Lösung dafür bestand darin, diese Auth -Tabellen beim Auslöschen meiner Datenbank einfach nicht zu löschen.

Wenn Sie es vorziehen, den Code direkt in die Python -Quelldatei zu initialisieren, kann dieser Code verwaltet.py helfen (und danke für den kleinen Code von 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

Ich zeige hier nur den Benutzererstellungscode, aber Sie können diesen Code mehr verbessern, wie Sie möchten.

Ich verwende SQLite als Entwicklerdatenbank. Lassen Sie nach dem Ändern von Modellklassen einfach die entsprechenden Tabellen mit SQLite Manager (Ein Firefox -Plugin, der sowieso geöffnet ist, um die Daten zu inspizieren) und laufen manage.py syncdb Um nachzubauen, was fehlt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top