จะทำให้โปรแกรม createuperuser โดยอัตโนมัติบน django ได้อย่างไร?


129

ผมต้องการที่จะทำงานอัตโนมัติmanage.py createsuperuserบนdjangoแต่มัน seams ว่ามีวิธีการตั้งค่ารหัสผ่านเริ่มต้นไม่มี

ฉันจะได้รับสิ่งนี้ได้อย่างไร? ต้องเป็นอิสระบนฐานข้อมูล django


1
คุณเคยดูเพียงแค่บันทึก superuser ที่คุณสร้างขึ้นและโหลดโดยใช้ Manage.py หรือไม่?
turbotux

1
คำตอบ @turbotux Hendrik F ใช้แนวทางที่คล้ายกันกับสิ่งที่คุณแนะนำพร้อมความสามารถเพิ่มเติมในการอ่านค่า (เข้าสู่ระบบรหัสผ่าน ... ) จาก env vars (หรือระบบไฟล์ ... ) ฉันขอแนะนำให้ไปทิศทางนี้แทนสคริปต์ python ad-hoc ซึ่งมีปัญหาเมื่อคุณรีสตาร์ทแอปพลิเคชัน
Ad N

คำตอบ:


145

หากคุณอ้างอิงผู้ใช้โดยตรงรหัสของคุณจะไม่ทำงานในโปรเจ็กต์ที่มีการเปลี่ยนการตั้งค่า AUTH_USER_MODEL เป็นรุ่นผู้ใช้อื่น วิธีทั่วไปในการสร้างผู้ใช้คือ:

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

คำตอบเดิม

ที่นี่มีสคริปต์เวอร์ชันง่ายๆในการสร้าง superuser:

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

2
มีประโยชน์มากเมื่อพยายามสร้าง superuser ใน heroku และเครือข่ายของคุณบล็อกพอร์ต 5000
Vic

4
ฉันจะลบ superuser ที่มีอยู่ดังนั้นสิ่งนี้ใช้ได้กับทุก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
บิลด์

12
โดยส่วนตัวแล้วฉันไม่คิดว่าการลบผู้ใช้ในแต่ละบิลด์เป็นความคิดที่ดี คุณเสี่ยงที่จะลบบันทึกที่เกี่ยวข้องโดยไม่ได้ตั้งใจผ่านการลบแบบเรียงซ้อน ตัวเลือกที่ปลอดภัยกว่าคือการประกันตัวหากมีผู้ใช้อยู่แล้ว (หรืออัปเดตบันทึกผู้ใช้ที่มีอยู่)
จะ

6
อย่างน้อยใน Django 1.11 ลำดับของอาร์กิวเมนต์คือ ('username', 'email', 'pass') ไม่ใช่ ('email', 'username', 'pass') ดู: docs.djangoproject.com/en/1.11/ref/contrib/auth/…
np8

3
from django.contrib.auth.models import Userไม่ทำงานอีกต่อไป ใช้สิ่งนี้: 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

ฉันกำลังค้นหาคำตอบนี้ด้วยตัวเอง ฉันตัดสินใจสร้างคำสั่ง Django ซึ่งขยายcreatesuperuserคำสั่งพื้นฐาน( GitHub ):

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

ตัวอย่างการใช้งาน:

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

สิ่งนี้มีข้อดีคือยังคงรองรับการใช้คำสั่งเริ่มต้นในขณะที่ยังอนุญาตให้ใช้แบบไม่โต้ตอบเพื่อระบุรหัสผ่าน


4
นี่ควรเป็นคำตอบที่ได้รับการโหวต (และได้รับการยอมรับ) มากที่สุด
bruno desthuilliers

ฉันหวังว่าค่าเริ่มต้นcreatesuperuserจะมี--passwordฟิลด์นี้ด้วย
เฉดสี

1
คุณสามารถเพิ่มตัวอย่างการใช้งาน:./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'
shai

2
วิธีการที่createsuperuser2แมปไปยังชั้นนี้ฟังก์ชั่น
Srinath พระพิฆเนศวร

2
@SrinathGanesh ดูที่docs.djangoproject.com/en/1.8/howto/custom-management-commands คุณต้องตั้งชื่อไฟล์ python createsuperuser2.pyและวางลงในโครงสร้างไดเร็กทอรีที่กำหนดจากลิงค์ด้านบน
ElectRocnic

43

ฉันใช้ './manage.py shell -c':

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

สิ่งนี้ไม่ได้ใช้เสียงสะท้อนพิเศษ แต่มีประโยชน์ที่คุณสามารถส่งต่อไปยังคอนเทนเนอร์นักเทียบท่าเพื่อดำเนินการได้ โดยไม่จำเป็นต้องใช้sh -c "... "ซึ่งจะทำให้คุณเข้าสู่การอ้างถึงหนีนรก

และจำไว้ว่าชื่อผู้ใช้มาก่อนอีเมล

หากคุณมีโมเดลผู้ใช้ที่กำหนดเองคุณต้องนำเข้าและไม่ต้อง auth.models.User


1
ทำงานให้ฉัน ขอบคุณ!
TimH - Codidact

ดูเหมือนจะไม่ได้ผลสำหรับฉันฉันเห็น:AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
Brodan

เมื่อคุณมีรูปแบบผู้ใช้ที่กำหนดเองเช่นusers.User คุณต้องนำเข้าจากนั้นไม่ใช่จากauth.User
yvess

30

ฉันขอแนะนำให้เรียกใช้การย้ายข้อมูลดังนั้นเมื่อใช้การย้ายข้อมูลกับโปรเจ็กต์ผู้ใช้ขั้นสูงจะถูกสร้างขึ้นเพื่อเป็นส่วนหนึ่งของการย้ายข้อมูล ชื่อผู้ใช้และรหัสผ่านสามารถตั้งค่าเป็นตัวแปรสภาพแวดล้อมได้ นอกจากนี้ยังมีประโยชน์เมื่อเรียกใช้แอปในคอนเทนเนอร์ (ดูหัวข้อนี้เป็นตัวอย่าง)

การย้ายข้อมูลของคุณจะมีลักษณะดังนี้:

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

หวังว่าจะช่วยได้!

แก้ไข : บางคนอาจตั้งคำถามว่าจะตั้งค่าตัวแปรสภาพแวดล้อมเหล่านี้อย่างไรและทำให้ Django ตระหนักถึงสิ่งเหล่านี้ มีหลายวิธีและได้รับคำตอบในโพสต์ SO อื่น ๆ แต่ในฐานะตัวชี้ด่วนการสร้าง.envไฟล์เป็นความคิดที่ดี จากนั้นคุณสามารถใช้แพ็คเกจpython-dotenv ได้แต่ถ้าคุณตั้งค่าสภาพแวดล้อมเสมือนด้วย pipenv ระบบจะตั้งค่า envvars ใน.envไฟล์ของคุณโดยอัตโนมัติ ในทำนองเดียวกันการเรียกใช้แอปของคุณผ่าน Docker-compose สามารถอ่านใน.envไฟล์ของคุณได้


1
เคล็ดลับ: โปรดพิจารณาแนวทางนี้ นี่คือคำตอบคุณภาพสูง: โดยธรรมชาติแล้วจะใช้ประโยชน์จากฟังก์ชันในตัวของ Django เพื่อตอบคำถามแทนที่จะสะท้อนสคริปต์ python เฉพาะกิจรวมทั้งแก้ไขปัญหาที่ใหญ่ที่สุดของคำตอบที่ยอมรับโดยธรรมชาติ (การย้ายข้อมูลจะใช้เพียงครั้งเดียวในการปรับใช้ ดังนั้นผู้ใช้จะถูกสร้างขึ้นเพียงครั้งเดียว) ทำงานได้อย่างสวยงามในบริบทคอนเทนเนอร์
Ad N

นี่เป็นคำตอบที่ดี ฉันยังไม่รู้ว่าโค้ดชิ้นนี้ตรงไหนในโปรเจ็กต์?
Pablo Ruiz Ruiz

ควรอยู่ในโฟลเดอร์การย้ายข้อมูลของคุณเช่นroot/⁨mysite⁩/myapp⁩/⁨migrations⁩- หากคุณอ่านเอกสารมันจะอธิบายวิธีสร้างการย้ายข้อมูลที่ว่างเปล่าและแก้ไขสิ่งนั้นpython manage.py makemigrations --empty yourappname
Hendrik F

ทำไมคุณถึงต้องการ DJANGO_DB_NAME ไม่เคยใช้
thoroc

คุณควรพูดถึงการเพิ่มสิ่งต่อไปนี้เพื่อโหลด. env vars ลงในsettings.pyไฟล์: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 คุณสามารถใช้ค่าเริ่มต้นcreatesuperuser --noinputคำสั่งและการตั้งค่าฟิลด์ที่จำเป็นทั้งหมด (รวมทั้งรหัสผ่าน) เป็นตัวแปรสภาพแวดล้อมDJANGO_SUPERUSER_PASSWORD, DJANGO_SUPERUSER_USERNAME, DJANGO_SUPERUSER_EMAILตัวอย่างเช่น --noinputต้องระบุแฟล็ก

สิ่งนี้มาจากเอกสารต้นฉบับ: https://docs.djangoproject.com/en/3.0/ref/django-admin/#django-admin-createsuperuser

และฉันเพิ่งตรวจสอบ - ใช้งานได้ ตอนนี้คุณสามารถส่งออกตัวแปรสภาพแวดล้อมเหล่านั้นและเพิ่มลงcreatesuperuserในสคริปต์และท่อของคุณได้อย่างง่ายดาย


14

คุณสามารถเขียนสคริปต์ python ง่ายๆเพื่อจัดการกับการสร้าง superuser โดยอัตโนมัติ Userโมเดลดังกล่าวเป็นเพียงโมเดล Django ธรรมดาดังนั้นคุณต้องทำตามขั้นตอนปกติในการเขียนสคริปต์ Django แบบสแตนด์อโลน Ex:

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

นอกจากนี้คุณยังสามารถส่งผ่านcreatesuperuserตัวเลือกต่างๆ ได้แก่--noinputและ--usernameซึ่งจะช่วยให้คุณสร้าง superusers ใหม่โดยอัตโนมัติ แต่จะไม่สามารถเข้าสู่ระบบได้จนกว่าคุณจะตั้งรหัสผ่านสำหรับพวกเขา


2
ตกลงสำหรับcretesuperuserแต่จะตั้งรหัสผ่านอย่างไร? ฉันต้องการทำสิ่งนั้นภายในสคริปต์ทุบตี ...
caneta

10

คำตอบที่ได้รับการโหวตมากที่สุดในปัจจุบัน:

  • ลบผู้ใช้หากมีอยู่และตามที่ @Groady ระบุไว้ในความคิดเห็นที่คุณเสี่ยงต่อการลบบันทึกที่เกี่ยวข้องโดยไม่ได้ตั้งใจผ่านการลบแบบเรียงซ้อน
  • ตรวจสอบการกรองการมีอยู่ของผู้ใช้ขั้นสูงทางไปรษณีย์ดังนั้นหากผู้ใช้ระดับสูงสองคนมีพระเจ้าเมลเดียวกันจะรู้ว่าสิ่งใดลบออก
  • การอัปเดตพารามิเตอร์สคริปต์เป็นเรื่องยุ่งยากเช่นชื่อผู้ใช้รหัสผ่านและอีเมล
  • ไม่บันทึกสิ่งที่ทำ

เวอร์ชันที่ปรับปรุงแล้วจะเป็น:

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
สะอาด (ดีกว่า) มากกว่าคำตอบที่ยอมรับ คุณยังสามารถใช้: 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


นี่เป็นวิธีแก้ปัญหาที่ง่ายที่สุด แต่คุณสามารถเขียนทับnoinputค่าสถานะด้วยDJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email admin@email.com --noinput
พารามิเตอร์

1

ฉันใช้ Tk421 หนึ่งซับ แต่ได้รับข้อความแสดงข้อผิดพลาดว่า: 1) ฉันคิดว่าฉันกำลังใช้ Django (1.10) รุ่นที่ใหม่กว่าManager isn't available; 'auth.User' has been swapped for 'users.User'2) ลำดับของพารามิเตอร์ใน create_superuser ผิด

ดังนั้นฉันจึงแทนที่ด้วย:

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

และสิ่งที่ฉันพอใจมากก็คือมันใช้งานได้กับการปรับใช้ heroku ด้วย:

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

วิธีนี้จะได้ผลดีซ้ำ ๆ ฉันใช้มันเป็นจุดเริ่มต้นของโครงการดังนั้นอย่ากังวลกับการลบแบบเรียงซ้อนที่น่ากลัวซึ่งอาจเกิดขึ้นในภายหลัง

ฉันได้กลับมาอีกครั้งหลังจากมีปัญหาในการเรียกใช้สิ่งนี้ภายใน local () จากผ้า สิ่งที่ดูเหมือนจะเกิดขึ้นคือสัญลักษณ์ไปป์หมายความว่ามันถูกตีความในท้องถิ่นมากกว่าที่จะเป็นฮีโร่ ในการจัดเรียงสิ่งนี้ฉันรวมคำสั่งไว้ในเครื่องหมายคำพูด จากนั้นต้องใช้เครื่องหมายคำพูดคู่สามเท่าสำหรับสตริง python ภายในเครื่องหมายคำพูดเดียวของคำสั่ง python ทั้งหมด

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

วิธีการแก้ปัญหาขึ้นอยู่กับอดัม Charnockวิธี 's ข้างต้นสามารถใช้ได้เป็นแพคเกจหลามโดยขณะนี้ ใช้สามขั้นตอน:

  1. ติดตั้ง: pip install django-createsuperuserwithpassword

  2. เปิดใช้งาน: INSTALLED_APPS += ("django_createsuperuserwithpassword", )

  3. สมัคร:

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

แค่นั้นแหละ.


0

ง่ายมากฟังสัญญาณ syncdb โพสต์และอ่านข้อมูลรับรอง superuser จากไฟล์กำหนดค่าและนำไปใช้

เช็คเอาต์ django-bootup

https://github.com/un33k/django-bootup/blob/master/README


2
ลิงค์ไม่สามารถใช้ได้อีกต่อไป
Tk421

อยู่ที่: github.com/un33k/django-bootup - แต่สิ่งนี้บอกว่าเลิกใช้เพื่อสนับสนุนgithub.com/un33k/django-finalware
stephendwolff

0

สคริปต์ python ขนาดเล็กนี้สามารถสร้างผู้ใช้ปกติหรือ superuser

#!/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 & - รหัสผ่านไม่บังคับ

หากไม่ได้กำหนด --superuser ผู้ใช้ปกติจะถูกสร้างขึ้นหาก - ไม่ได้กำหนด - รหัสผ่านระบบจะสร้างรหัสผ่านแบบสุ่ม

    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

นี่คือสิ่งที่ฉันปูด้วยกันสำหรับ Heroku post_deployและตัวแปรapp.json ที่กำหนดไว้ล่วงหน้า:

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

ด้วยสิ่งนี้คุณสามารถมีตัวแปร env เดียว:

CREATE_SUPER_USER=admin:admin@example.com:password

ฉันชอบอ็อพชัน shell --commandแต่ไม่แน่ใจว่ารับอักขระ newline ในสคริปต์คำสั่งอย่างไร หากไม่มีการขึ้นบรรทัดใหม่ifนิพจน์จะส่งผลให้เกิดข้อผิดพลาดทางไวยากรณ์


0

ไปที่พรอมต์คำสั่งและพิมพ์:

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

หากไม่ดำเนินการย้ายข้อมูลให้ไปที่โฟลเดอร์แอปพลิเคชัน django และดำเนินการต่อไปนี้

  1. python Manage.py โยกย้าย
  2. python Manage.py createuperuser

แล้วก็บิงโก


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 มันง่ายกว่ามาก

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

ดังที่คนอื่น ๆ กล่าวถึงด้วย Django 3.0 คุณสามารถส่งผ่านข้อมูลรับรองผ่านตัวแปรสภาพแวดล้อม อย่างไรก็ตามวิธีนี้มีความยืดหยุ่นมากกว่าเนื่องจากช่วยให้คุณสามารถทำงานอื่น ๆ ที่ซับซ้อนมากขึ้นเช่นการลบผู้ใช้การทดสอบทั้งหมดเป็นต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.