자동으로 실행 manage.py createsuperuser
하고 django
싶지만 기본 비밀번호를 설정할 방법이 없다는 것이 확인되었습니다.
어떻게 얻을 수 있습니까? 장고 데이터베이스에서 독립적이어야합니다.
자동으로 실행 manage.py createsuperuser
하고 django
싶지만 기본 비밀번호를 설정할 방법이 없다는 것이 확인되었습니다.
어떻게 얻을 수 있습니까? 장고 데이터베이스에서 독립적이어야합니다.
답변:
User를 직접 참조 하면 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
원래 답변
다음은 수퍼 유저를 만드는 스크립트의 간단한 버전입니다.
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')
나는 이것에 대한 답을 직접 찾고 있었다. 기본 createsuperuser
명령 ( GitHub ) 을 확장하는 Django 명령을 만들기로 결정했습니다 .
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 를 사용하여 가상 환경을 설정 한 경우 .env
파일에 envvar를 자동으로 설정 합니다. 마찬가지로 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)
장고 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 스크립트를 작성할 수 있습니다. 이 User
모델은 일반 Django 모델이므로 독립 실행 형 Django 스크립트를 작성하는 일반적인 프로세스를 따릅니다. 전의:
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
하면 새 수퍼 유저를 자동으로 생성 할 수 있지만 비밀번호를 설정할 때까지 로그인 할 수 없습니다.
cretesuperuser
. 그러나 비밀번호를 설정하는 방법은 무엇입니까? 나는 그것을 bash 스크립트 내에서하고 싶습니다 ...
현재 가장 많이 투표 한 답변 :
개선 된 버전은 다음과 같습니다.
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 () 내부를 실행하는 데 문제가 발생한 후 다시 방문했습니다. 일어나고있는 것처럼 보이는 것은 파이프 기호가 그것이 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"
위 의 Adam Charnock 의 접근 방식을 기반으로 한 솔루션 은 현재 Python 패키지로 제공됩니다. 세 단계가 필요합니다.
설치: pip install django-createsuperuserwithpassword
활성화 : INSTALLED_APPS += ("django_createsuperuserwithpassword", )
대다:
python manage.py createsuperuserwithpassword \
--username admin \
--password admin \
--email admin@example.org \
--preserve
그게 다야.
매우 쉽습니다. post syncdb 신호를 듣고 구성 파일에서 수퍼 유저 자격 증명을 읽고 적용합니다.
체크 아웃 django-bootup
이 작은 파이썬 스크립트는 일반 사용자 또는 수퍼 유저를 만들 수 있습니다.
#!/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는 필수가 아닙니다.
--superuser가 정의되지 않은 경우 일반 사용자가 생성됩니다. --password가 정의되지 않은 경우 임의의 비밀번호가 생성됩니다.
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
이를 통해 단일 환경 변수를 가질 수 있습니다.
CREATE_SUPER_USER=admin:admin@example.com:password
나는 shell --command 옵션을 좋아 하지만 명령 스크립트에서 줄 바꿈 문자를 얻는 방법을 잘 모르겠습니다. 줄 바꿈이 없으면 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 응용 프로그램 폴더로 이동하여 다음을 실행하십시오.
다음 빙고.