ผมต้องการที่จะทำงานอัตโนมัติmanage.py createsuperuser
บนdjango
แต่มัน seams ว่ามีวิธีการตั้งค่ารหัสผ่านเริ่มต้นไม่มี
ฉันจะได้รับสิ่งนี้ได้อย่างไร? ต้องเป็นอิสระบนฐานข้อมูล django
ผมต้องการที่จะทำงานอัตโนมัติmanage.py createsuperuser
บนdjango
แต่มัน seams ว่ามีวิธีการตั้งค่ารหัสผ่านเริ่มต้นไม่มี
ฉันจะได้รับสิ่งนี้ได้อย่างไร? ต้องเป็นอิสระบนฐานข้อมูล django
คำตอบ:
หากคุณอ้างอิงผู้ใช้โดยตรงรหัสของคุณจะไม่ทำงานในโปรเจ็กต์ที่มีการเปลี่ยนการตั้งค่า 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
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
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')
ฉันกำลังค้นหาคำตอบนี้ด้วยตัวเอง ฉันตัดสินใจสร้างคำสั่ง 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'
สิ่งนี้มีข้อดีคือยังคงรองรับการใช้คำสั่งเริ่มต้นในขณะที่ยังอนุญาตให้ใช้แบบไม่โต้ตอบเพื่อระบุรหัสผ่าน
createsuperuser
จะมี--password
ฟิลด์นี้ด้วย
./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'
createsuperuser2
แมปไปยังชั้นนี้ฟังก์ชั่น
createsuperuser2.py
และวางลงในโครงสร้างไดเร็กทอรีที่กำหนดจากลิงค์ด้านบน
ฉันใช้ './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
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
users.User
คุณต้องนำเข้าจากนั้นไม่ใช่จากauth.User
ฉันขอแนะนำให้เรียกใช้การย้ายข้อมูลดังนั้นเมื่อใช้การย้ายข้อมูลกับโปรเจ็กต์ผู้ใช้ขั้นสูงจะถูกสร้างขึ้นเพื่อเป็นส่วนหนึ่งของการย้ายข้อมูล ชื่อผู้ใช้และรหัสผ่านสามารถตั้งค่าเป็นตัวแปรสภาพแวดล้อมได้ นอกจากนี้ยังมีประโยชน์เมื่อเรียกใช้แอปในคอนเทนเนอร์ (ดูหัวข้อนี้เป็นตัวอย่าง)
การย้ายข้อมูลของคุณจะมีลักษณะดังนี้:
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
ไฟล์ของคุณได้
root/mysite/myapp/migrations
- หากคุณอ่านเอกสารมันจะอธิบายวิธีสร้างการย้ายข้อมูลที่ว่างเปล่าและแก้ไขสิ่งนั้นpython manage.py makemigrations --empty yourappname
settings.py
ไฟล์:python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
ในฐานะของ 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
ในสคริปต์และท่อของคุณได้อย่างง่ายดาย
คุณสามารถเขียนสคริปต์ 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 ใหม่โดยอัตโนมัติ แต่จะไม่สามารถเข้าสู่ระบบได้จนกว่าคุณจะตั้งรหัสผ่านสำหรับพวกเขา
cretesuperuser
แต่จะตั้งรหัสผ่านอย่างไร? ฉันต้องการทำสิ่งนั้นภายในสคริปต์ทุบตี ...
คำตอบที่ได้รับการโหวตมากที่สุดในปัจจุบัน:
เวอร์ชันที่ปรับปรุงแล้วจะเป็น:
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
if not User.objects.filter(username = username).exists()
,
DJANGO_SUPERUSER_USERNAME=testuser \
DJANGO_SUPERUSER_PASSWORD=testpass \
python manage.py createsuperuser --noinput
noinput
ค่าสถานะด้วยDJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email admin@email.com --noinput
ฉันใช้ 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"
วิธีการแก้ปัญหาขึ้นอยู่กับอดัม Charnockวิธี 's ข้างต้นสามารถใช้ได้เป็นแพคเกจหลามโดยขณะนี้ ใช้สามขั้นตอน:
ติดตั้ง: pip install django-createsuperuserwithpassword
เปิดใช้งาน: INSTALLED_APPS += ("django_createsuperuserwithpassword", )
สมัคร:
python manage.py createsuperuserwithpassword \
--username admin \
--password admin \
--email admin@example.org \
--preserve
แค่นั้นแหละ.
ง่ายมากฟังสัญญาณ syncdb โพสต์และอ่านข้อมูลรับรอง superuser จากไฟล์กำหนดค่าและนำไปใช้
เช็คเอาต์ django-bootup
สคริปต์ 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
นี่คือสิ่งที่ฉันปูด้วยกันสำหรับ 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
นิพจน์จะส่งผลให้เกิดข้อผิดพลาดทางไวยากรณ์
ไปที่พรอมต์คำสั่งและพิมพ์:
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 และดำเนินการต่อไปนี้
แล้วก็บิงโก
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')"
ด้วย shell_plus มันง่ายกว่ามาก
echo "User.objects.create_superuser('test@test.com', 'test')" | python manage.py shell_plus
ดังที่คนอื่น ๆ กล่าวถึงด้วย Django 3.0 คุณสามารถส่งผ่านข้อมูลรับรองผ่านตัวแปรสภาพแวดล้อม อย่างไรก็ตามวิธีนี้มีความยืดหยุ่นมากกว่าเนื่องจากช่วยให้คุณสามารถทำงานอื่น ๆ ที่ซับซ้อนมากขึ้นเช่นการลบผู้ใช้การทดสอบทั้งหมดเป็นต้น