장고에서 createsuperuser를 자동화하는 방법은 무엇입니까?
자동으로 실행 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
나는 이것에 대한 답을 직접 찾고 있었다. 기본 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'
이는 기본 명령 사용을 계속 지원하는 동시에 암호를 지정하는 데 비대화 형 사용을 허용한다는 장점이 있습니다.
나는 './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
수퍼 유저 생성 자동화를 처리하기 위해 간단한 python 스크립트를 작성할 수 있습니다. User
독립 실행 형 장고 스크립트를 작성하는 일반적인 과정을 따라 줄 수 있도록 모델, 그냥 일반 장고 모델입니다. 전의:
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
하면 새 수퍼 유저를 자동으로 생성 할 수 있지만 비밀번호를 설정할 때까지 로그인 할 수 없습니다.
데이터 마이그레이션을 실행하는 것이 좋으므로 마이그레이션이 프로젝트에 적용될 때 마이그레이션의 일부로 수퍼 유저가 생성됩니다. 사용자 이름과 암호는 환경 변수로 설정할 수 있습니다. 이는 컨테이너에서 앱을 실행할 때도 유용합니다 ( 이 스레드 를 예제로 참조 ).
데이터 마이그레이션은 다음과 같습니다.
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),
]
도움이 되었기를 바랍니다.
현재 가장 많이 투표 한 답변 :
- 사용자가 존재하고 @Groady가 주석에서 언급 한대로 사용자를 삭제하면 계단식 삭제를 통해 관련 레코드를 실수로 삭제할 위험이 있습니다.
- Checks superuser existence filtering by mail so if two superusers have the same mail god knows which one it deletes.
- It is cumbersome to update the script parameters: username, password, and mail.
- Does not log what it did.
An improved version would be:
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
I used Tk421 one liner but got an error message as: 1) I think I am using a later version of Django (1.10) Manager isn't available; 'auth.User' has been swapped for 'users.User'
2) the order of the parameters to create_superuser was wrong.
So I replaced it with:
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
and what I as really pleased with is that it works on a heroku deployment as well:
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
This will work nicely repeatedly. I am using it the beginning of a project so don't worry about the terrible cascaded deletes that might occur later.
I have revisited after some trouble with running this inside local() from fabric. what seemed to be happening is that the pipe symbol mean that it was getting interpreted locally rather than on heroku. To sort this I wrapped in the command in quotes. Then had to used triple double quotes for the python strings inside the single quotes of the whole python command.
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"
very easy, listen on post syncdb signal and read superuser credentials from a configuration file and apply it.
checkout django-bootup
This small python script could create a normal user or a 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 & --password are not mandatory.
If --superuser is not defined, normal user will be created If --password is not defined, a random password will be generated
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
This is what I cobbled together for Heroku post_deploy and a predefined app.json variable:
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
With this you can have a single env variable:
CREATE_SUPER_USER=admin:admin@example.com:password
I like the shell --command option, but not sure how the get newline character in the command script. Without the newline the if
expression results in syntax error.
Go to command prompt and type:
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
if not executed the migration then go to django application folder and execute following
- python manage.py migrate
- python manage.py createsuperuser
then bingo.
A solution based on Adam Charnock's approach above is available as a Python package by now. It takes three steps:
Install:
pip install django-createsuperuserwithpassword
Activate:
INSTALLED_APPS += ("django_createsuperuserwithpassword", )
Apply:
python manage.py createsuperuserwithpassword \ --username admin \ --password admin \ --email admin@example.org \ --preserve
That's it.
참고URL : https://stackoverflow.com/questions/6244382/how-to-automate-createsuperuser-on-django
'Programming' 카테고리의 다른 글
스토리 보드에서 사용자 지정 글꼴이있는 특성 문자열이 올바르게로드되지 않음 (0) | 2020.08.25 |
---|---|
도메인 URL과 애플리케이션 이름을 얻는 방법은 무엇입니까? (0) | 2020.08.24 |
Xcode Project Navigator에서 물음표는 무엇을 의미합니까? (0) | 2020.08.24 |
BadImageFormatException 문제 해결 (0) | 2020.08.24 |
gulp.run은 더 이상 사용되지 않습니다. (0) | 2020.08.24 |