Django'da createuperuser'ı nasıl otomatikleştirebilirim?


129

Otomatik olarak çalıştırmak istiyorum manage.py createsuperuser, djangoancak varsayılan bir şifre belirlemenin bir yolu olmadığını gösteriyor.

Bunu nasıl elde edebilirim? Django veritabanında bağımsız olması gerekir.


1
Oluşturduğunuz süper kullanıcınızı bir fikstür kaydetmeye ve manage.py kullanarak yüklemeye baktınız mı?
turbotux

1
@turbotux Hendrik F yanıtı, değerleri (oturum açma, parola ...) env değişkenlerinden (veya dosya sisteminden, ...) okuma özelliğiyle birlikte önerdiğiniz şeye benzer bir yaklaşım benimser. Uygulamayı yeniden başlattığınızda sorunları olan geçici python komut dosyaları yerine bu yönde ilerlemenizi şiddetle öneririm.
Reklam N

Yanıtlar:


145

Eğer başvuru olursa Kullanıcının doğrudan kod AUTH_USER_MODEL ayarı farklı bir kullanıcı modeli olarak değiştirildi projelerde çalışmaz. Kullanıcıyı oluşturmanın daha genel bir yolu şudur:

echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'admin@myproject.com', 'password')" | python manage.py shell

ORİJİNAL CEVAP

Burada bir süper kullanıcı oluşturmak için komut dosyasının basit bir sürümü var:

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

2
heroku'da süper kullanıcı oluşturmaya çalışırken ve ağınız 5000 numaralı bağlantı noktasını engellediğinde çok kullanışlı
Vic

4
Mevcut süper kullanıcıyı silerim, bu nedenle bu her yapı için geçerlidir: echo "from django.contrib.auth.models import User; User.objects.filter(email='admin@example.com').delete(); User.objects.create_superuser('admin@example.com', 'admin', 'nimda')" | python manage.py shell
Montaro

12
Kişisel olarak, her yapıda kullanıcıyı silmenin iyi bir fikir olduğunu düşünmüyorum. Art arda silme yoluyla ilişkili tüm kayıtları istemeden silme riskini alırsınız. Daha güvenli bir seçenek, kullanıcı zaten mevcutsa kurtarma işlemini yapmaktır (veya mevcut Kullanıcı kaydını güncellemektir).
Will

6
En azından Django 1.11'de. bağımsız değişkenlerin sırası ('kullanıcı adı', 'e-posta', 'şifre') şeklindedir, ('e-posta', 'kullanıcı adı', 'geçiş') değil. Bakınız: docs.djangoproject.com/en/1.11/ref/contrib/auth/…
np8

3
from django.contrib.auth.models import UserArtık çalışmıyor. Bunu kullanın: from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'admin@myproject.com', 'my secure password')
dcalde

49

Buna kendim bir cevap arıyordum. Temel createsuperuserkomutu ( GitHub ) genişleten bir Django komutu oluşturmaya karar verdim :

from django.contrib.auth.management.commands import createsuperuser
from django.core.management import CommandError


class Command(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 and not username:
            raise CommandError("--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()

Örnek kullanım:

./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'

Bu, varsayılan komut kullanımını desteklemeye devam ederken, aynı zamanda bir parola belirlemek için etkileşimli olmayan kullanıma izin verme avantajına sahiptir.


4
Bu, en çok verilen (ve kabul edilen) cevap olmalıdır.
bruno desthuilliers

Varsayılan diliyorum createsuperuserbu vardı --passwordçok alanı
vasiliy

1
Örnek bir kullanım ekleyebilirsiniz:./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'
shadi

2
createsuperuser2bu sınıfa nasıl eşlenir, işlev
Srinath Ganesh

2
Bir göz @SrinathGanesh docs.djangoproject.com/en/1.8/howto/custom-management-commands Sen piton dosyasını isim gerekir createsuperuser2.pyve yukarıdaki bağlantıdan tanımlanan dizin yapısı içine yerleştirin.
ElectRocnic

43

'./Manage.py shell -c' kullanıyorum:

./manage.py shell -c "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'adminpass')"

Bu fazladan bir yankı kullanmaz, bu, onu yürütmek için bir docker konteynerine aktarabilmenize yarar. Sh -c "..." kullanmaya gerek kalmadan cehennemden kaçmak için alıntı yapmanıza neden olur.

Ve e-postadan daha önce kullanıcı adının geldiğini unutmayın .

Özel bir kullanıcı modeliniz varsa, bunu içe aktarmanız gerekir, auth.models.User


1
Benim için çalıştı. Teşekkürler!
TimH - Codidact

Benim için işe yaramıyor gibi görünüyor, görüyorum:AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
Brodan

sizin gibi özel bir kullanıcı modeliniz olduğunda, users.User ondan içe aktarmanız gerekirauth.User
2019

30

Bir Veri Taşıma çalıştırmanızı öneririm , bu nedenle projeye geçişler uygulandığında, geçişlerin bir parçası olarak bir süper kullanıcı oluşturulur. Kullanıcı adı ve şifre, ortam değişkenleri olarak ayarlanabilir. Bu, bir kapsayıcıda bir uygulama çalıştırırken de yararlıdır ( örnek olarak bu iş parçacığına bakın )

Veri geçişiniz şu şekilde görünecektir:

import os
from django.db import migrations

class Migration(migrations.Migration):
    dependencies = [
        ('<your_app>', '<previous_migration>'),
    ] # can also be emtpy if it's your first migration

    def generate_superuser(apps, schema_editor):
        from django.contrib.auth.models import User

        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),
    ]

Umarım yardımcı olur!

DÜZENLEME : Bazıları bu ortam değişkenlerinin nasıl ayarlanacağı sorusunu gündeme getirebilir ve Django'nun bunlardan haberdar olmasını sağlayabilir. Birçok yol vardır ve diğer SO gönderilerinde yanıtlanmıştır, ancak hızlı bir işaretçi olarak, bir .envdosya oluşturmak iyi bir fikirdir. Daha sonra python-dotenv paketini kullanabilirsiniz, ancak pipenv ile sanal bir ortam kurduysanız, .envdosyanızdaki envvarları otomatik olarak ayarlayacaktır . Benzer şekilde, uygulamanızı docker-compose aracılığıyla çalıştırmak dosyanızı okuyabilir .env.


1
İPUCU: Lütfen bu yaklaşımı düşünün . Bu yüksek kaliteli bir cevaptır: ad-hoc python komut dosyalarını tekrarlamak yerine soruyu cevaplamak için doğal olarak Django'nun yerleşik işlevlerinden yararlanır, ayrıca doğal olarak kabul edilen cevabın en büyük sorununu ele alır (bir dağıtımda yalnızca bir kez geçiş uygulanır. , bu nedenle kullanıcı yalnızca bir kez oluşturulur). Kapsayıcı bağlamında güzel çalışır.
Ad N

Bu harika bir cevap gibi görünüyor. Hala bu kod parçasının projenin neresine sığdığını bilmiyorum?
Pablo Ruiz Ruiz

Bu, geçişler klasörünüzde olmalıdır, örneğin root/⁨mysite⁩/myapp⁩/⁨migrations⁩- belgeleri okursanız, boş bir geçişi nasıl oluşturup değiştirebileceğinizi açıklarpython manage.py makemigrations --empty yourappname
Hendrik F

DJANGO_DB_NAME’ye neden ihtiyacınız var? asla kullanılmaz.
thoroc

.Env değişkenlerini settings.pydosyaya yüklemek için aşağıdakileri eklemeyi söylemelisiniz :python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
thoroc

23

Django 3.0 itibariyle varsayılan kullanabilirsiniz createsuperuser --noinputkomutu ve ortam değişkenleri olarak (şifre dahil) tüm gerekli alanları ayarlamak DJANGO_SUPERUSER_PASSWORD, DJANGO_SUPERUSER_USERNAME, DJANGO_SUPERUSER_EMAILörneğin. --noinputbayrak gerekli.

Bu, orijinal belgelerden gelir: https://docs.djangoproject.com/en/3.0/ref/django-admin/#django-admin-createsuperuser

ve az önce kontrol ettim - çalışıyor. Artık bu ortam değişkenlerini kolayca dışa aktarabilir ve createsuperuserkomut dosyalarınıza ve ardışık düzenlerinize ekleyebilirsiniz .


14

Süper kullanıcı oluşturmanın otomasyonunu işlemek için basit bir python betiği yazabilirsiniz. UserEğer tek başına bir Django senaryoyu yazarken normal süreci takip ediyorum böylece modeli, sadece normal Django modelidir. Ör:

import django
django.setup()

from django.contrib.auth.models import User

u = User(username='unique_fellow')
u.set_password('a_very_cryptic_password')
u.is_superuser = True
u.is_staff = True
u.save()

Ayrıca createsuperuser, yeni süper kullanıcılar oluşturmanıza izin veren --noinputve --usernamegibi birkaç seçeneği de geçebilirsiniz , ancak siz onlar için bir şifre ayarlayana kadar oturum açamazlar.


2
Tamam cretesuperuser, ama o zaman şifre nasıl ayarlanır? Bunu bir bash betiğinin içinde yapmak istiyorum ...
caneta

10

Mevcut en çok oylanan cevap:

  • Kullanıcı varsa ve @Groady tarafından yorumlarda belirtildiği gibi, bir kademeli silme yoluyla ilişkili kayıtları istemeden silme riskiyle karşı karşıya kalırsınız.
  • Süper kullanıcı varlığını postayla filtrelemeyi denetler, böylece iki süper kullanıcı aynı postaya sahipse hangisini sileceğini tanrı bilir.
  • Komut dosyası parametrelerini güncellemek zahmetlidir: kullanıcı adı, şifre ve posta.
  • Ne yaptığını kaydetmez.

Geliştirilmiş bir sürüm şöyle olacaktır:

USER="admin"
PASS="super_password"
MAIL="admin@mail.com"
script="
from django.contrib.auth.models import User;

username = '$USER';
password = '$PASS';
email = '$MAIL';

if User.objects.filter(username=username).count()==0:
    User.objects.create_superuser(username, email, password);
    print('Superuser created.');
else:
    print('Superuser creation skipped.');
"
printf "$script" | python manage.py shell

2
Kabul edilen cevaptan çok daha temiz (daha iyi). Ayrıca kullanmış olabilir: if not User.objects.filter(username = username).exists(),
Philippe Fanaro

5
DJANGO_SUPERUSER_USERNAME=testuser \
DJANGO_SUPERUSER_PASSWORD=testpass \
python manage.py createsuperuser --noinput

Createuser komutu için belgeler


Bu en kolay çözümdür. Ancak noinputdiğer parametrelerle bayrağın üzerine yazabilirsiniz :DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email admin@email.com --noinput
dannydedog

1

Tk421'i tek satırlık kullandım ancak şu şekilde bir hata mesajı aldım: 1) Django'nun (1.10) sonraki bir sürümünü kullandığımı düşünüyorum. Manager isn't available; 'auth.User' has been swapped for 'users.User'2) create_superuser için parametrelerin sırası yanlıştı.

Ben de şununla değiştirdim:

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

ve benim gerçekten memnun olduğum şey, bir heroku dağıtımında da işe yaraması:

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

Bu defalarca güzel çalışacaktır. Bunu bir projenin başlangıcında kullanıyorum, bu yüzden daha sonra meydana gelebilecek korkunç kademeli silmeler için endişelenmeyin.

Bunu local () içinde kumaştan çalıştırmakla ilgili bazı sorunlardan sonra tekrar ziyaret ettim. Görünen o ki boru sembolü, heroku yerine yerel olarak yorumlandığı anlamına geliyordu. Bunu sıralamak için komutu tırnak içine aldım. Daha sonra, tüm python komutunun tek tırnak içindeki python dizeleri için üçlü çift tırnak kullanmak zorunda kaldı.

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"

1

Adam Charnock'un yukarıdaki yaklaşımına dayanan bir çözüm şu anda bir Python paketi olarak mevcuttur. Üç adımda gerçekleşir:

  1. Yüklemek: pip install django-createsuperuserwithpassword

  2. etkinleştirin: INSTALLED_APPS += ("django_createsuperuserwithpassword", )

  3. Uygulamak:

    python manage.py createsuperuserwithpassword \
            --username admin \
            --password admin \
            --email admin@example.org \
            --preserve

Bu kadar.



0

Bu küçük python betiği normal bir kullanıcı veya süper kullanıcı oluşturabilir

#!/usr/bin/env python

import os
import sys
import argparse
import random
import string
import django


def main(arguments):

    parser = argparse.ArgumentParser()
    parser.add_argument('--username', dest='username', type=str)
    parser.add_argument('--email', dest='email', type=str)
    parser.add_argument('--settings', dest='settings', type=str)
    parser.add_argument('--project_dir', dest='project_dir', type=str)
    parser.add_argument('--password', dest='password', type=str, required=False)
    parser.add_argument('--superuser', dest='superuser', action='store_true', required=False)

    args = parser.parse_args()

    sys.path.append(args.project_dir)
    os.environ['DJANGO_SETTINGS_MODULE'] = args.settings
    from django.contrib.auth.models import User
    django.setup()

    username = args.username
    email = args.email
    password = ''.join(random.sample(string.letters, 20)) if args.password is None else args.password
    superuser = args.superuser 

    try:
        user_obj = User.objects.get(username=args.username)
        user_obj.set_password(password)
        user_obj.save()
    except User.DoesNotExist:
    if superuser:
            User.objects.create_superuser(username, email, password)
    else:
        User.objects.create_user(username, email, password)

    print password


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))

--superuser & --password zorunlu değildir.

--Superuser tanımlanmamışsa, normal kullanıcı oluşturulacaktır --parola tanımlanmadıysa, rastgele bir parola oluşturulacaktır

    Ex : 
        /var/www/vhosts/PROJECT/python27/bin/python /usr/local/sbin/manage_dja_superusertest.py --username USERNAME --email TEST@domain.tld --project_dir /var/www/vhosts/PROJECT/PROJECT/ --settings PROJECT.settings.env 

0

Bu, Heroku post_deploy ve önceden tanımlanmış bir app.json değişkeni için birleştirdiğim şey :

if [[ -n "$CREATE_SUPER_USER" ]]; then
    echo "==> Creating super user"
    cd /app/example_project/src
    printf "from django.contrib.auth.models import User\nif not User.objects.exists(): User.objects.create_superuser(*'$CREATE_SUPER_USER'.split(':'))" | python /app/example_project/manage.py shell
fi

Bununla tek bir ortam değişkenine sahip olabilirsiniz:

CREATE_SUPER_USER=admin:admin@example.com:password

Ben gibi kabuk --command seçeneği, ama kesin değil nasıl komut komut olsun satır karakteri. Satırsonu olmadan ififade sözdizimi hatasına neden olur.


0

Komut istemine gidin ve şunu yazın:

C:\WINDOWS\system32>pip install django-createsuperuser
Collecting django-createsuperuser
  Downloading https://files.pythonhosted.org/packages/93/8c/344c6367afa62b709adebee039d09229675f1ee34d424180fcee9ed857a5/django-createsuperuser-2019.4.13.tar.gz
Requirement already satisfied: Django>1.0 in c:\programdata\anaconda3\lib\site-packages (from django-createsuperuser) (2.2.1)
Requirement already satisfied: setuptools in c:\programdata\anaconda3\lib\site-packages (from django-createsuperuser) (41.0.1)
Requirement already satisfied: sqlparse in c:\programdata\anaconda3\lib\site-packages (from Django>1.0->django-createsuperuser) (0.3.0)
Requirement already satisfied: pytz in c:\programdata\anaconda3\lib\site-packages (from Django>1.0->django-createsuperuser) (2018.7)
Building wheels for collected packages: django-createsuperuser
  Running setup.py bdist_wheel for django-createsuperuser ... done
  Stored in directory: C:\Users\Arif Khan\AppData\Local\pip\Cache\wheels\0c\96\2a\e73e95bd420e844d3da1c9d3e496c92642a4f2181535440db2
Successfully built django-createsuperuser
Installing collected packages: django-createsuperuser

taşıma gerçekleştirilmezse django uygulama klasörüne gidin ve aşağıdakileri yürütün

  1. python manage.py migrate
  2. python manage.py createsuperuser

sonra tombala.


0
python manage.py shell -c "from django.contrib.auth.models import User; \
                           User.objects.filter(username='admin1').exists() or \
                           User.objects.create_superuser('admin1',
                           'admin1@example.com', 'admin1')"

0

Shell_plus ile aslında çok daha kolay

echo "User.objects.create_superuser('test@test.com', 'test')" | python manage.py shell_plus

Diğerlerinde belirtildiği gibi, Django 3.0 ile kimlik bilgilerini ortam değişkenleri aracılığıyla iletebilirsiniz. Ancak bu yaklaşım çok daha esnektir çünkü tüm test kullanıcılarını kaldırmak gibi daha karmaşık görevleri yerine getirmenize izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.