我想在manage.py createsuperuser
上自动运行django
,但似乎无法设置默认密码。
我怎么能得到这个?它必须独立于django数据库。
答案 0 :(得分:113)
如果您直接引用用户,则您的代码将无法在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
答案 1 :(得分:29)
我自己正在寻找答案。我决定创建一个扩展基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'
这样做的好处是仍支持默认命令使用,同时还允许非交互式使用来指定密码。
答案 2 :(得分:25)
我使用' ./ manage.py shell -c':
./manage.py shell -c "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'adminpass')"
这并没有使用额外的回声,这样做的好处是可以将它传递给docker容器执行。无需使用 sh -c" ..." ,这可以让你逃脱地狱。
请记住第一个来自用户名,而不是电子邮件。
答案 3 :(得分:12)
您可以编写一个简单的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
,这样可以让您自动创建新的超级用户,但在您设置之前他们将无法登录他们的密码。
答案 4 :(得分:10)
DJANGO_SUPERUSER_USERNAME=testuser \
DJANGO_SUPERUSER_PASSWORD=testpass \
python manage.py createsuperuser --noinput
答案 5 :(得分:6)
目前投票最多的回答:
改进版本将是:
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
答案 6 :(得分:5)
我建议运行Data Migration,因此,将迁移应用于项目时,将在迁移过程中创建一个超级用户。可以将用户名和密码设置为环境变量。在容器中运行应用程序时,这也很有用(例如,请参见this thread)
您的数据迁移将如下所示:
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),
]
希望有帮助!
答案 7 :(得分:2)
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import User
class Command(BaseCommand):
def handle(self, *args, **options):
# The magic line
User.objects.create_user(username= 'rmx',
email='superuser@super.com',
password='rmx55',
is_staff=True,
is_active=True,
is_superuser=True
)
答案 8 :(得分: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
这将很好地重复。我正在使用它作为项目的开始,所以不要担心以后可能发生的可怕的级联删除。
我在从fabric中运行local()之后遇到了一些麻烦后重新访问了。似乎正在发生的事情是管道符号意味着它在本地解释而不是在heroku上。为了对此进行排序,我在命令中包含了引号。然后必须在整个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"
答案 9 :(得分:1)
使用shell_plus,实际上要容易得多
echo "User.objects.create_superuser('test@test.com', 'test')" | python manage.py shell_plus
正如其他人提到的那样,在Django 3.0中,您可以通过环境变量传递凭据。但是,这种方法更加灵活,因为它允许您执行任何其他更复杂的任务,例如删除所有测试用户等。
答案 10 :(得分: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应用程序文件夹并执行以下操作
然后宾果游戏。
答案 11 :(得分:0)
我喜欢使用无服务器/docker 构建 AppConfig.ready 方法/事件来执行此类操作,这里是一个示例:
import logging
from django.apps import AppConfig
from django.contrib.auth import get_user_model
from django.utils.translation import gettext_lazy as gettext
class Config(AppConfig):
name: str = "apps.policy"
label: str = "policy"
verbose_name: str = gettext("Policies")
@classmethod
def ready(cls):
user_model = get_user_model()
log = logging.getLogger(cls.label)
try:
if not user_model.objects.filter(username="admin").first():
log.info("Creating default superuser with user and password: admin")
user_model.objects.create_superuser('admin', 'admin@admin.admin', 'admin')
except Exception:
log.warn(
"Found an error trying to create the superuser, if you aren't"
"run the user model migration yet, ignore this message"
)
当我第一次在数据库中启动我的项目时,我看到:
2021-06-22 06:19:02 policy/info Creating default superuser with user and password: admin
Performing system checks...
System check identified no issues (1 silenced).
June 22, 2021 - 06:19:02
Django version 3.1.12, using settings 'settings.env.default'
Starting development server at http://0.0.0.0:8027/
Quit the server with CONTROL-C.
答案 12 :(得分:0)
python manage.py shell < mysite/create_superuser.py
mysite/create_superuser.py
from decouple import config
from django.db import IntegrityError
# getting name,email & password from env variables
DJANGO_SU_NAME = config('DJANGO_SU_NAME')
DJANGO_SU_EMAIL = config('DJANGO_SU_EMAIL')
DJANGO_SU_PASSWORD = config('DJANGO_SU_PASSWORD')
try:
superuser = User.objects.create_superuser(
username=DJANGO_SU_NAME,
email=DJANGO_SU_EMAIL,
password=DJANGO_SU_PASSWORD)
superuser.save()
except IntegrityError:
print(f"Super User with username {DJANGO_SU_NAME} is already present")
except Exception as e:
print(e)
答案 13 :(得分:0)
您可以像这样在自定义命令中创建超级用户:
import os
from django.contrib.auth.models import User
from django.core.management import BaseCommand, call_command
from immo_project import settings
class Command(BaseCommand):
def handle(self, *args, **options):
call_command('createsuperuser', interactive=False, username='admin', email='test@example.com')
user = User.objects.get(username='admin')
user.set_password('password')
user.save()
答案 14 :(得分:0)
从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
添加到脚本和管道中。
答案 15 :(得分:0)
基于solution的方法Adam Charnock的above现已作为Python软件包提供。这需要三个步骤:
安装:pip install django-createsuperuserwithpassword
激活:INSTALLED_APPS += ("django_createsuperuserwithpassword", )
应用:
python manage.py createsuperuserwithpassword \
--username admin \
--password admin \
--email admin@example.org \
--preserve
就是这样。
答案 16 :(得分: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选项,但不确定如何在命令脚本中获取换行符。如果没有换行符,if
表达式会导致语法错误。
答案 17 :(得分:0)
这个小python脚本可以创建普通用户或超级用户
#!/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:]))
- 超级用户&amp; - 密码不是强制性的。
如果未定义--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
答案 18 :(得分:0)
非常简单,收听post syncdb信号并从配置文件中读取超级用户凭据并应用它。
checkout django-bootup
答案 19 :(得分:-1)
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')"