czy zastanawiałeś się nad zapisaniem utworzonego superużytkownika jako urządzenia i załadowaniem go za pomocą manage.py?
turbotux
1
Odpowiedź @turbotux Hendrik F przyjmuje podobne podejście do tego, co sugerujesz, z dodatkową możliwością odczytu wartości (login, hasło ...) z zmiennych env (lub systemu plików, ...). Zdecydowanie sugerowałbym pójście w tym kierunku zamiast skryptów pythonowych ad-hoc, które mają problemy po ponownym uruchomieniu aplikacji.
Ad N
Odpowiedzi:
145
Jeśli odwołujesz się bezpośrednio do użytkownika , kod nie będzie działał w projektach, w których ustawienie AUTH_USER_MODEL zostało zmienione na inny model użytkownika. Bardziej ogólny sposób tworzenia użytkownika to:
Osobiście nie uważam, że usuwanie użytkownika w każdej kompilacji jest dobrym pomysłem. Ryzykujesz niezamierzone usunięcie wszelkich powiązanych rekordów za pomocą usuwania kaskadowego. Bezpieczniejszą opcją jest po prostu wykupienie pomocy, jeśli użytkownik już istnieje (lub zaktualizowanie istniejącego rekordu użytkownika).
Will
6
Przynajmniej w Django 1.11. kolejność argumentów to („nazwa użytkownika”, „e-mail”, „hasło”), a nie („adres e-mail”, „nazwa użytkownika”, „hasło”). Zobacz: docs.djangoproject.com/en/1.11/ref/contrib/auth/…
np8
3
from django.contrib.auth.models import Usernie działa. Użyj tego: from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', '[email protected]', 'my secure password')
dcalde
49
Sam szukałem odpowiedzi na to pytanie. Postanowiłem stworzyć polecenie Django, które rozszerza createsuperuserpolecenie podstawowe ( GitHub ):
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()
Nie używa to dodatkowego echa, ma tę zaletę, że można go przekazać do kontenera dockera w celu wykonania. Bez potrzeby używania sh -c "...", co powoduje, że cytat ucieka z piekła.
I pamiętaj, że najpierw jest nazwa użytkownika, a nie e-mail.
Jeśli masz niestandardowy model użytkownika, musisz go zaimportować, a nie auth.models.User
Wydaje się, że nie działa dla mnie, widzę:AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
Brodan
kiedy masz niestandardowy model użytkownika, taki jak users.User musisz importować z niego, a nie zauth.User
yvess
30
Sugerowałbym uruchomienie migracji danych , więc kiedy migracje są stosowane do projektu, w ramach migracji tworzony jest superużytkownik. Nazwę użytkownika i hasło można ustawić jako zmienne środowiskowe. Jest to również przydatne podczas uruchamiania aplikacji w kontenerze (zobacz ten wątek jako przykład)
Twoja migracja danych wyglądałaby wtedy następująco:
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),]
Mam nadzieję, że to pomoże!
EDYCJA : Niektórzy mogą zadać pytanie, jak ustawić te zmienne środowiskowe i uświadomić Django o ich istnieniu. Jest wiele sposobów i odpowiedź na to pytanie znajduje się w innych postach SO, ale jako szybki wskaźnik, .envdobrym pomysłem jest utworzenie pliku. Możesz wtedy użyć pakietu python-dotenv , ale jeśli skonfigurowałeś środowisko wirtualne z pipenv, automatycznie ustawi on zmienne envars w twoim .envpliku. Podobnie, uruchomienie aplikacji przez docker-compose może spowodować odczytanie .envpliku.
WSKAZÓWKA: Rozważ to podejście . To jest odpowiedź wysokiej jakości: naturalnie wykorzystuje wbudowane funkcje Django, aby odpowiedzieć na pytanie, zamiast powtarzać skrypty Pythona ad-hoc, a ponadto naturalnie rozwiązuje największy problem z zaakceptowaną odpowiedzią (migracja jest stosowana tylko raz na wdrożeniu , więc użytkownik jest tworzony tylko raz). Świetnie sprawdza się w kontekście kontenera.
Ad N
To wydaje się świetna odpowiedź. Nadal nie wiem, gdzie w projekcie pasuje ten fragment kodu?
Pablo Ruiz Ruiz
Powinien znajdować się w folderze migracji, np. root/mysite/myapp/migrations- jeśli czytasz dokumenty, wyjaśnia, jak możesz utworzyć pustą migrację i ją zmodyfikowaćpython manage.py makemigrations --empty yourappname
Hendrik F
Dlaczego potrzebujesz DJANGO_DB_NAME? nigdy nie jest używany.
thoroc
Należy wspomnieć o dodaniu następujących elementów, aby załadować zmienne .env do settings.pypliku:python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
thoroc
23
Jak Django 3.0 można użyć domyślnego createsuperuser --noinputpolecenia i ustawić wszystkie wymagane pola (w tym hasła) jako zmienne środowiskowe DJANGO_SUPERUSER_PASSWORD, DJANGO_SUPERUSER_USERNAME, DJANGO_SUPERUSER_EMAILna przykład. --noinputflaga jest wymagana.
Możesz napisać prosty skrypt w Pythonie do automatyzacji tworzenia superużytkowników. UserModel jest po prostu normalnym modelu Django, więc chcesz śledzić normalny proces pisania samodzielnych Django skryptu. Dawny:
Możesz również przekazać createsuperuserkilka opcji, a mianowicie --noinputi --username, które pozwolą ci automatycznie tworzyć nowych superużytkowników, ale nie będą mogli się zalogować, dopóki nie ustawisz dla nich hasła.
Ok cretesuperuser, ale jak wtedy ustawić hasło? Chciałbym to zrobić w skrypcie basha ...
caneta
10
Aktualnie najczęściej głosowana odpowiedź:
Usuwa użytkownika, jeśli istnieje i jak zauważył @Groady w komentarzach, ryzykujesz niezamierzone usunięcie wszelkich powiązanych rekordów za pomocą usuwania kaskadowego.
Sprawdza filtrowanie istnienia superużytkowników przez pocztę, więc jeśli dwóch superużytkowników ma tę samą pocztę, Bóg wie, który z nich usuwa.
Aktualizacja parametrów skryptu: nazwy użytkownika, hasła i poczty jest uciążliwa.
To najłatwiejsze rozwiązanie. Ale możesz nadpisać noinputflagę innymi parametrami:DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email [email protected] --noinput
dannydedog
1
Użyłem jednej wkładki Tk421, ale otrzymałem komunikat o błędzie: 1) Myślę, że używam późniejszej wersji Django (1.10) Manager isn't available; 'auth.User' has been swapped for 'users.User' 2) kolejność parametrów do create_superuser była nieprawidłowa.
i bardzo mi się podoba, że działa również na wdrożeniu heroku:
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
To będzie dobrze działać wielokrotnie. Używam go na początku projektu, więc nie martw się o okropne kaskadowe usuwanie, które może nastąpić później.
Wróciłem po problemach z uruchomieniem tego wewnątrz local () z tkaniny. wydawało się, że dzieje się tak, że symbol fajki oznacza, że był interpretowany lokalnie, a nie na heroku. Aby to posortować, zawinąłem polecenie w cudzysłów. Następnie musiał użyć potrójnych podwójnych cudzysłowów dla ciągów znaków Pythona w pojedynczych cudzysłowach całego polecenia Pythona.
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"
Jeśli opcja --superuser nie jest zdefiniowana, zostanie utworzony zwykły użytkownik Jeśli --password nie jest zdefiniowane, zostanie wygenerowane hasło losowe
Podoba mi się opcja shell --command , ale nie jestem pewien, jak uzyskać znak nowego wiersza w skrypcie poleceń. Bez znaku nowej linii ifwyrażenie powoduje błąd składni.
Jak wspominali inni, z Django 3.0 możesz przekazać referencje poprzez zmienne środowiskowe. Jednak to podejście jest znacznie bardziej elastyczne, ponieważ pozwala na wykonanie innych bardziej skomplikowanych zadań, takich jak usunięcie wszystkich użytkowników testów itp.
Odpowiedzi:
Jeśli odwołujesz się bezpośrednio do użytkownika , kod nie będzie działał w projektach, w których ustawienie AUTH_USER_MODEL zostało zmienione na inny model użytkownika. Bardziej ogólny sposób tworzenia użytkownika to:
ORYGINALNA ODPOWIEDŹ
Oto prosta wersja skryptu do tworzenia superużytkownika:
źródło
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
nie działa. Użyj tego:from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', '[email protected]', 'my secure password')
Sam szukałem odpowiedzi na to pytanie. Postanowiłem stworzyć polecenie Django, które rozszerza
createsuperuser
polecenie podstawowe ( GitHub ):Przykładowe zastosowanie:
Ma to tę zaletę, że nadal obsługuje domyślne użycie poleceń, a jednocześnie umożliwia nieinteraktywne użycie do określania hasła.
źródło
createsuperuser
miało to--password
pole./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email '[email protected]'
createsuperuser2
mapowane do tej klasy, funkcjacreatesuperuser2.py
i umieścić go w zdefiniowanej strukturze katalogów z linku powyżej.Używam './manage.py shell -c':
Nie używa to dodatkowego echa, ma tę zaletę, że można go przekazać do kontenera dockera w celu wykonania. Bez potrzeby używania sh -c "...", co powoduje, że cytat ucieka z piekła.
I pamiętaj, że najpierw jest nazwa użytkownika, a nie e-mail.
Jeśli masz niestandardowy model użytkownika, musisz go zaimportować, a nie
auth.models.User
źródło
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
users.User
musisz importować z niego, a nie zauth.User
Sugerowałbym uruchomienie migracji danych , więc kiedy migracje są stosowane do projektu, w ramach migracji tworzony jest superużytkownik. Nazwę użytkownika i hasło można ustawić jako zmienne środowiskowe. Jest to również przydatne podczas uruchamiania aplikacji w kontenerze (zobacz ten wątek jako przykład)
Twoja migracja danych wyglądałaby wtedy następująco:
Mam nadzieję, że to pomoże!
EDYCJA : Niektórzy mogą zadać pytanie, jak ustawić te zmienne środowiskowe i uświadomić Django o ich istnieniu. Jest wiele sposobów i odpowiedź na to pytanie znajduje się w innych postach SO, ale jako szybki wskaźnik,
.env
dobrym pomysłem jest utworzenie pliku. Możesz wtedy użyć pakietu python-dotenv , ale jeśli skonfigurowałeś środowisko wirtualne z pipenv, automatycznie ustawi on zmienne envars w twoim.env
pliku. Podobnie, uruchomienie aplikacji przez docker-compose może spowodować odczytanie.env
pliku.źródło
root/mysite/myapp/migrations
- jeśli czytasz dokumenty, wyjaśnia, jak możesz utworzyć pustą migrację i ją zmodyfikowaćpython manage.py makemigrations --empty yourappname
settings.py
pliku:python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
Jak Django 3.0 można użyć domyślnego
createsuperuser --noinput
polecenia i ustawić wszystkie wymagane pola (w tym hasła) jako zmienne środowiskoweDJANGO_SUPERUSER_PASSWORD
,DJANGO_SUPERUSER_USERNAME
,DJANGO_SUPERUSER_EMAIL
na przykład.--noinput
flaga jest wymagana.Pochodzi z oryginalnej dokumentacji: https://docs.djangoproject.com/en/3.0/ref/django-admin/#django-admin-createsuperuser
i właśnie sprawdziłem - działa. Teraz możesz łatwo wyeksportować te zmienne środowiskowe i dodać je
createsuperuser
do swoich skryptów i potoków.źródło
Możesz napisać prosty skrypt w Pythonie do automatyzacji tworzenia superużytkowników.
User
Model jest po prostu normalnym modelu Django, więc chcesz śledzić normalny proces pisania samodzielnych Django skryptu. Dawny:Możesz również przekazać
createsuperuser
kilka opcji, a mianowicie--noinput
i--username
, które pozwolą ci automatycznie tworzyć nowych superużytkowników, ale nie będą mogli się zalogować, dopóki nie ustawisz dla nich hasła.źródło
cretesuperuser
, ale jak wtedy ustawić hasło? Chciałbym to zrobić w skrypcie basha ...Aktualnie najczęściej głosowana odpowiedź:
Ulepszona wersja to:
źródło
if not User.objects.filter(username = username).exists()
,Dokumentacja dla polecenia createuser
źródło
noinput
flagę innymi parametrami:DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email [email protected] --noinput
Użyłem jednej wkładki Tk421, ale otrzymałem komunikat o błędzie: 1) Myślę, że używam późniejszej wersji Django (1.10)
Manager isn't available; 'auth.User' has been swapped for 'users.User'
2) kolejność parametrów do create_superuser była nieprawidłowa.Więc zastąpiłem go:
i bardzo mi się podoba, że działa również na wdrożeniu heroku:
To będzie dobrze działać wielokrotnie. Używam go na początku projektu, więc nie martw się o okropne kaskadowe usuwanie, które może nastąpić później.
Wróciłem po problemach z uruchomieniem tego wewnątrz local () z tkaniny. wydawało się, że dzieje się tak, że symbol fajki oznacza, że był interpretowany lokalnie, a nie na heroku. Aby to posortować, zawinąłem polecenie w cudzysłów. Następnie musiał użyć potrójnych podwójnych cudzysłowów dla ciągów znaków Pythona w pojedynczych cudzysłowach całego polecenia Pythona.
źródło
Rozwiązanie oparte na Adam Charnock podejścia jest powyżej są dostępne w postaci pakietu Python teraz. To wymaga trzech kroków:
Zainstalować:
pip install django-createsuperuserwithpassword
Aktywuj:
INSTALLED_APPS += ("django_createsuperuserwithpassword", )
Zastosować:
Otóż to.
źródło
bardzo łatwe, słuchaj na sygnale po synchronizacji, odczytaj poświadczenia superużytkownika z pliku konfiguracyjnego i zastosuj je.
źródło
Ten mały skrypt w Pythonie może stworzyć zwykłego użytkownika lub superużytkownika
--superuser i --password nie są obowiązkowe.
Jeśli opcja --superuser nie jest zdefiniowana, zostanie utworzony zwykły użytkownik Jeśli --password nie jest zdefiniowane, zostanie wygenerowane hasło losowe
źródło
Oto, co zebrałem razem dla Heroku post_deploy i wstępnie zdefiniowanej zmiennej app.json :
Dzięki temu możesz mieć jedną zmienną env:
Podoba mi się opcja shell --command , ale nie jestem pewien, jak uzyskać znak nowego wiersza w skrypcie poleceń. Bez znaku nowej linii
if
wyrażenie powoduje błąd składni.źródło
Przejdź do wiersza poleceń i wpisz:
jeśli nie zostanie wykonana migracja, przejdź do folderu aplikacji django i wykonaj następujące czynności
potem bingo.
źródło
źródło
Z shell_plus jest to o wiele łatwiejsze
Jak wspominali inni, z Django 3.0 możesz przekazać referencje poprzez zmienne środowiskowe. Jednak to podejście jest znacznie bardziej elastyczne, ponieważ pozwala na wykonanie innych bardziej skomplikowanych zadań, takich jak usunięcie wszystkich użytkowników testów itp.
źródło