Haben Sie nur versucht, Ihrem erstellten Superuser ein Gerät zu speichern und es mit manage.py zu laden?
Turbotux
1
Die Antwort von @turbotux Hendrik F ähnelt dem, was Sie vorschlagen, mit der zusätzlichen Möglichkeit, die Werte (Login, Passwort ...) von env vars (oder Dateisystem, ...) zu lesen. Ich würde dringend empfehlen, diese Richtung anstelle der Ad-hoc-Python-Skripte einzuschlagen, die Probleme beim Neustart der Anwendung haben.
Ad N
Antworten:
143
Wenn Sie direkt auf Benutzer verweisen , funktioniert Ihr Code nicht in Projekten, in denen die Einstellung AUTH_USER_MODEL in ein anderes Benutzermodell geändert wurde. Eine allgemeinere Methode zum Erstellen des Benutzers wäre:
Super nützlich, wenn Sie versuchen, einen Superuser in Heroku zu erstellen, und Ihr Netzwerk blockiert Port 5000
Vic
4
Ich würde den vorhandenen Superuser löschen, daher gilt dies für jeden Build: echo "from django.contrib.auth.models import User; User.objects.filter(email='[email protected]').delete(); User.objects.create_superuser('[email protected]', 'admin', 'nimda')" | python manage.py shell
Montaro
12
Persönlich halte ich das Löschen des Benutzers bei jedem Build nicht für eine gute Idee. Sie riskieren das unbeabsichtigte Löschen zugehöriger Datensätze über eine Kaskadenlöschung. Eine sicherere Option besteht darin, einfach auszusteigen, wenn der Benutzer bereits vorhanden ist (oder den vorhandenen Benutzerdatensatz zu aktualisieren).
from django.contrib.auth.models import Userfunktioniert nicht mehr. Verwenden Sie diese: from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', '[email protected]', 'my secure password')
dcalde
48
Ich habe selbst nach einer Antwort gesucht. Ich habe beschlossen, einen Django-Befehl zu erstellen, der den Basisbefehl createsuperuser( GitHub ) erweitert:
from django.contrib.auth.management.commands import createsuperuser
from django.core.management importCommandErrorclassCommand(createsuperuser.Command):
help ='Crate a superuser, and allow password to be provided'def add_arguments(self, parser):super(Command,self).add_arguments(parser)
parser.add_argument('--password', dest='password',default=None,
help='Specifies the password for the superuser.',)def handle(self,*args,**options):
password = options.get('password')
username = options.get('username')
database = options.get('database')if password andnot username:raiseCommandError("--username is required if specifying --password")super(Command,self).handle(*args,**options)if password:
user =self.UserModel._default_manager.db_manager(database).get(username=username)
user.set_password(password)
user.save()
Dies hat den Vorteil, dass die Standardbefehlsverwendung weiterhin unterstützt wird und gleichzeitig eine nicht interaktive Verwendung zur Angabe eines Kennworts möglich ist.
Dies sollte die am besten bewertete (und akzeptierte) Antwort sein.
Bruno Desthuilliers
Ich wünschte, die Standardeinstellung createsuperuserhätte auch dieses --passwordFeld
Shadi
1
Sie könnten ein Beispiel für die Verwendung hinzufügen:./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email '[email protected]'
Shadi
2
Wie wird createsuperuser2dieser Klasse zugeordnet, Funktion
Dies verwendet kein zusätzliches Echo. Dies hat den Vorteil, dass Sie es zur Ausführung an einen Docker-Container übergeben können. Ohne die Notwendigkeit, sh -c "..." zu verwenden , bringt Sie das Zitat dazu, der Hölle zu entkommen.
Und denken Sie daran, dass zuerst der Benutzername als die E-Mail kommt.
Wenn Sie ein benutzerdefiniertes Benutzermodell haben, müssen Sie dieses importieren und nicht auth.models.User
Scheint nicht für mich zu funktionieren, ich AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
sehe
Wenn Sie ein benutzerdefiniertes Benutzermodell haben, wie users.User Sie es importieren müssen und nicht vonauth.User
yvess
29
Ich würde vorschlagen, eine Datenmigration auszuführen . Wenn also Migrationen auf das Projekt angewendet werden, wird im Rahmen der Migrationen ein Superuser erstellt. Der Benutzername und das Passwort können als Umgebungsvariablen eingerichtet werden. Dies ist auch nützlich, wenn Sie eine App in einem Container ausführen (siehe diesen Thread als Beispiel).
Ihre Datenmigration würde dann folgendermaßen aussehen:
import os
from django.db import migrations
classMigration(migrations.Migration):
dependencies =[('<your_app>','<previous_migration>'),]# can also be emtpy if it's your first migrationdef generate_superuser(apps, schema_editor):from django.contrib.auth.models importUser
DJANGO_DB_NAME = os.environ.get('DJANGO_DB_NAME',"default")
DJANGO_SU_NAME = os.environ.get('DJANGO_SU_NAME')
DJANGO_SU_EMAIL = os.environ.get('DJANGO_SU_EMAIL')
DJANGO_SU_PASSWORD = os.environ.get('DJANGO_SU_PASSWORD')
superuser =User.objects.create_superuser(
username=DJANGO_SU_NAME,
email=DJANGO_SU_EMAIL,
password=DJANGO_SU_PASSWORD)
superuser.save()
operations =[
migrations.RunPython(generate_superuser),]
Hoffentlich hilft das!
BEARBEITEN : Einige werfen möglicherweise die Frage auf, wie diese Umgebungsvariablen festgelegt und Django auf sie aufmerksam gemacht werden können. Es gibt viele Möglichkeiten und es wurde in anderen SO-Posts beantwortet, aber nur als schneller Zeiger ist das Erstellen einer .envDatei eine gute Idee. Sie können dann das Paket python-dotenv verwenden. Wenn Sie jedoch eine virtuelle Umgebung mit pipenv eingerichtet haben, werden die envvars in Ihrer .envDatei automatisch festgelegt . Ebenso kann das Ausführen Ihrer App über Docker-Compose Ihre .envDatei einlesen .
TIPP: Bitte beachten Sie diesen Ansatz . Dies ist eine qualitativ hochwertige Antwort: Sie nutzt natürlich die integrierten Funktionen von Django, um die Frage zu beantworten, anstatt Ad-hoc-Python-Skripte zu wiederholen. Außerdem wird das größte Problem der akzeptierten Antwort angesprochen (eine Migration wird bei einer Bereitstellung nur einmal angewendet , so dass der Benutzer nur einmal erstellt wird). Es funktioniert wunderbar in einem Containerkontext.
Ad N
Dies scheint eine gute Antwort zu sein. Ich weiß immer noch nicht, wo in das Projekt dieser Code passt?
Pablo Ruiz Ruiz
Es sollte sich in Ihrem Migrationsordner befinden, z. B. root/mysite/myapp/migrations- wenn Sie die Dokumente lesen, wird erläutert, wie Sie eine leere Migration erstellen und diese ändern könnenpython manage.py makemigrations --empty yourappname
Hendrik F
Warum brauchst du den DJANGO_DB_NAME? es wird nie benutzt.
Thoroc
Sie sollten Folgendes hinzufügen, um die .env-Variablen in die settings.pyDatei zu laden :python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
thoroc
21
Ab Django 3.0 können Sie Standard verwenden createsuperuser --noinputBefehl und stellen Sie alle erforderlichen Felder (einschließlich Passwort) als Umgebungsvariablen DJANGO_SUPERUSER_PASSWORD, DJANGO_SUPERUSER_USERNAME, DJANGO_SUPERUSER_EMAILzum Beispiel. --noinputFlag ist erforderlich.
und ich habe gerade überprüft - es funktioniert. Jetzt können Sie diese Umgebungsvariablen einfach exportieren und createsuperuserzu Ihren Skripten und Pipelines hinzufügen .
Sie können ein einfaches Python-Skript schreiben, um die Automatisierung der Superuser-Erstellung zu übernehmen. Das UserModell ist nur ein normales Django-Modell. Sie folgen also dem normalen Prozess des Schreibens eines eigenständigen Django-Skripts. Ex:
Sie können auch createsuperusereinige Optionen übergeben, nämlich --noinputund --username, mit denen Sie automatisch neue Superuser erstellen können. Diese können sich jedoch erst anmelden, wenn Sie ein Kennwort für sie festgelegt haben.
Ok für cretesuperuser, aber wie kann man dann das Passwort einstellen? Ich würde das gerne in einem Bash-Skript machen ...
Caneta
10
Derzeit am häufigsten gewählte Antwort:
Löscht den Benutzer, falls vorhanden, und wie von @Groady in den Kommentaren angegeben, besteht die Gefahr, dass Sie alle zugehörigen Datensätze über eine Kaskadenlöschung unbeabsichtigt löschen.
Überprüft die Filterung der Superuser-Existenz nach E-Mails. Wenn also zwei Superuser dieselbe E-Mail haben, weiß Gott, welche sie löscht.
Das Aktualisieren der Skriptparameter Benutzername, Kennwort und E-Mail ist umständlich.
Dies ist die einfachste Lösung. Sie können die noinputFlagge jedoch mit anderen Parametern überschreiben :DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email [email protected] --noinput
dannydedog
1
Ich habe Tk421 one liner verwendet, aber eine Fehlermeldung erhalten als: 1) Ich glaube, ich verwende eine spätere Version von Django (1.10) Manager isn't available; 'auth.User' has been swapped for 'users.User'2) Die Reihenfolge der Parameter für create_superuser war falsch.
und was mich genauso freut, ist, dass es auch bei einem Heroku-Einsatz funktioniert:
heroku run echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(email='[email protected]', is_superuser=True).delete(); User.objects.create_superuser('admin', '[email protected]', 'nimda')"| python manage.py shell
Dies wird immer wieder gut funktionieren. Ich benutze es zu Beginn eines Projekts, also mach dir keine Sorgen über die schrecklichen kaskadierten Löschungen, die später auftreten könnten.
Ich habe nach einigen Problemen mit dem Ausführen von local () aus Fabric erneut besucht. Was zu passieren schien, war, dass das Pfeifensymbol bedeutet, dass es eher lokal als auf Heroku interpretiert wurde. Um dies zu sortieren, habe ich den Befehl in Anführungszeichen gesetzt. Dann mussten dreifache doppelte Anführungszeichen für die Python-Zeichenfolgen in den einfachen Anführungszeichen des gesamten Python-Befehls verwendet werden.
heroku run "echo 'from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(email="""admin@example.com""", is_superuser=True).delete(); User.objects.create_superuser("""admin""", """admin@example.com""", """nimda""")' | python manage.py shell"
Sehr einfach, hören Sie auf das Post-Syncdb-Signal und lesen Sie die Superuser-Anmeldeinformationen aus einer Konfigurationsdatei und wenden Sie sie an.
Ich mag die Shell- Option --command , bin mir aber nicht sicher, wie das Newline-Zeichen im Befehlsskript abgerufen wird. Ohne den Zeilenumbruch führt der ifAusdruck zu einem Syntaxfehler.
Wie bereits erwähnt, können Sie mit Django 3.0 die Anmeldeinformationen über Umgebungsvariablen übergeben. Dieser Ansatz ist jedoch viel flexibler, da Sie damit jede andere kompliziertere Aufgabe ausführen können, z. B. das Entfernen aller Testbenutzer usw.
Antworten:
Wenn Sie direkt auf Benutzer verweisen , funktioniert Ihr Code nicht in Projekten, in denen die Einstellung AUTH_USER_MODEL in ein anderes Benutzermodell geändert wurde. Eine allgemeinere Methode zum Erstellen des Benutzers wäre:
URSPRÜNGLICHE ANTWORT
Hier gibt es eine einfache Version des Skripts zum Erstellen eines Superusers:
quelle
echo "from django.contrib.auth.models import User; User.objects.filter(email='[email protected]').delete(); User.objects.create_superuser('[email protected]', 'admin', 'nimda')" | python manage.py shell
from django.contrib.auth.models import User
funktioniert nicht mehr. Verwenden Sie diese:from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', '[email protected]', 'my secure password')
Ich habe selbst nach einer Antwort gesucht. Ich habe beschlossen, einen Django-Befehl zu erstellen, der den Basisbefehl
createsuperuser
( GitHub ) erweitert:Anwendungsbeispiel:
Dies hat den Vorteil, dass die Standardbefehlsverwendung weiterhin unterstützt wird und gleichzeitig eine nicht interaktive Verwendung zur Angabe eines Kennworts möglich ist.
quelle
createsuperuser
hätte auch dieses--password
Feld./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email '[email protected]'
createsuperuser2
dieser Klasse zugeordnet, Funktioncreatesuperuser2.py
und über den obigen Link in die definierte Verzeichnisstruktur einfügen .Ich benutze './manage.py shell -c':
Dies verwendet kein zusätzliches Echo. Dies hat den Vorteil, dass Sie es zur Ausführung an einen Docker-Container übergeben können. Ohne die Notwendigkeit, sh -c "..." zu verwenden , bringt Sie das Zitat dazu, der Hölle zu entkommen.
Und denken Sie daran, dass zuerst der Benutzername als die E-Mail kommt.
Wenn Sie ein benutzerdefiniertes Benutzermodell haben, müssen Sie dieses importieren und nicht
auth.models.User
quelle
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
users.User
Sie es importieren müssen und nicht vonauth.User
Ich würde vorschlagen, eine Datenmigration auszuführen . Wenn also Migrationen auf das Projekt angewendet werden, wird im Rahmen der Migrationen ein Superuser erstellt. Der Benutzername und das Passwort können als Umgebungsvariablen eingerichtet werden. Dies ist auch nützlich, wenn Sie eine App in einem Container ausführen (siehe diesen Thread als Beispiel).
Ihre Datenmigration würde dann folgendermaßen aussehen:
Hoffentlich hilft das!
BEARBEITEN : Einige werfen möglicherweise die Frage auf, wie diese Umgebungsvariablen festgelegt und Django auf sie aufmerksam gemacht werden können. Es gibt viele Möglichkeiten und es wurde in anderen SO-Posts beantwortet, aber nur als schneller Zeiger ist das Erstellen einer
.env
Datei eine gute Idee. Sie können dann das Paket python-dotenv verwenden. Wenn Sie jedoch eine virtuelle Umgebung mit pipenv eingerichtet haben, werden die envvars in Ihrer.env
Datei automatisch festgelegt . Ebenso kann das Ausführen Ihrer App über Docker-Compose Ihre.env
Datei einlesen .quelle
root/mysite/myapp/migrations
- wenn Sie die Dokumente lesen, wird erläutert, wie Sie eine leere Migration erstellen und diese ändern könnenpython manage.py makemigrations --empty yourappname
settings.py
Datei zu laden :python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
Ab Django 3.0 können Sie Standard verwenden
createsuperuser --noinput
Befehl und stellen Sie alle erforderlichen Felder (einschließlich Passwort) als UmgebungsvariablenDJANGO_SUPERUSER_PASSWORD
,DJANGO_SUPERUSER_USERNAME
,DJANGO_SUPERUSER_EMAIL
zum Beispiel.--noinput
Flag ist erforderlich.Dies stammt aus den Originaldokumenten: https://docs.djangoproject.com/de/3.0/ref/django-admin/#django-admin-createsuperuser
und ich habe gerade überprüft - es funktioniert. Jetzt können Sie diese Umgebungsvariablen einfach exportieren und
createsuperuser
zu Ihren Skripten und Pipelines hinzufügen .quelle
Sie können ein einfaches Python-Skript schreiben, um die Automatisierung der Superuser-Erstellung zu übernehmen. Das
User
Modell ist nur ein normales Django-Modell. Sie folgen also dem normalen Prozess des Schreibens eines eigenständigen Django-Skripts. Ex:Sie können auch
createsuperuser
einige Optionen übergeben, nämlich--noinput
und--username
, mit denen Sie automatisch neue Superuser erstellen können. Diese können sich jedoch erst anmelden, wenn Sie ein Kennwort für sie festgelegt haben.quelle
cretesuperuser
, aber wie kann man dann das Passwort einstellen? Ich würde das gerne in einem Bash-Skript machen ...Derzeit am häufigsten gewählte Antwort:
Eine verbesserte Version wäre:
quelle
if not User.objects.filter(username = username).exists()
,Dokumentation für den Befehl createuser
quelle
noinput
Flagge jedoch mit anderen Parametern überschreiben :DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email [email protected] --noinput
Ich habe Tk421 one liner verwendet, aber eine Fehlermeldung erhalten als: 1) Ich glaube, ich verwende eine spätere Version von Django (1.10)
Manager isn't available; 'auth.User' has been swapped for 'users.User'
2) Die Reihenfolge der Parameter für create_superuser war falsch.Also habe ich es ersetzt durch:
und was mich genauso freut, ist, dass es auch bei einem Heroku-Einsatz funktioniert:
Dies wird immer wieder gut funktionieren. Ich benutze es zu Beginn eines Projekts, also mach dir keine Sorgen über die schrecklichen kaskadierten Löschungen, die später auftreten könnten.
Ich habe nach einigen Problemen mit dem Ausführen von local () aus Fabric erneut besucht. Was zu passieren schien, war, dass das Pfeifensymbol bedeutet, dass es eher lokal als auf Heroku interpretiert wurde. Um dies zu sortieren, habe ich den Befehl in Anführungszeichen gesetzt. Dann mussten dreifache doppelte Anführungszeichen für die Python-Zeichenfolgen in den einfachen Anführungszeichen des gesamten Python-Befehls verwendet werden.
quelle
Eine Lösung, die auf dem oben beschriebenen Ansatz von Adam Charnock basiert, ist jetzt als Python-Paket verfügbar. Es dauert drei Schritte:
Installieren:
pip install django-createsuperuserwithpassword
Aktivieren Sie:
INSTALLED_APPS += ("django_createsuperuserwithpassword", )
Anwenden:
Das ist es.
quelle
Sehr einfach, hören Sie auf das Post-Syncdb-Signal und lesen Sie die Superuser-Anmeldeinformationen aus einer Konfigurationsdatei und wenden Sie sie an.
quelle
Dieses kleine Python-Skript kann einen normalen Benutzer oder einen Superuser erstellen
--superuser & --password sind nicht obligatorisch.
Wenn --superuser nicht definiert ist, wird ein normaler Benutzer erstellt. Wenn --password nicht definiert ist, wird ein zufälliges Passwort generiert
quelle
Dies ist, was ich für Heroku post_deploy und eine vordefinierte app.json- Variable zusammengeschustert habe:
Damit können Sie eine einzelne env-Variable haben:
Ich mag die Shell- Option --command , bin mir aber nicht sicher, wie das Newline-Zeichen im Befehlsskript abgerufen wird. Ohne den Zeilenumbruch führt der
if
Ausdruck zu einem Syntaxfehler.quelle
Gehen Sie zur Eingabeaufforderung und geben Sie Folgendes ein:
Wenn die Migration nicht ausgeführt wurde, gehen Sie zum Django-Anwendungsordner und führen Sie Folgendes aus
dann Bingo.
quelle
quelle
Mit shell_plus ist es tatsächlich viel einfacher
Wie bereits erwähnt, können Sie mit Django 3.0 die Anmeldeinformationen über Umgebungsvariablen übergeben. Dieser Ansatz ist jedoch viel flexibler, da Sie damit jede andere kompliziertere Aufgabe ausführen können, z. B. das Entfernen aller Testbenutzer usw.
quelle