如何在django上自动化createsuperuser ?

我想在django上自动运行manage.py createsuperuser,但它似乎没有办法设置默认密码。

我怎么才能得到这个?它必须独立于django数据库。

109109 次浏览

您可以编写一个简单的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,这将让你自动创建新的超级用户,但他们将无法登录,直到你为他们设置密码。

非常简单,监听post syncdb信号,从配置文件中读取超级用户凭证并应用它。

检查django-finalware和它的前身django-bootup[已弃用]

如果直接引用用户,在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

目前投票最多的答案:

  • 如果用户存在,则删除该用户,正如@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

这个小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:]))

——超级用户,——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

我自己也在寻找答案。我决定创建一个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'

这样做的优点是仍然支持默认命令的使用,同时还允许使用非交互式的方式指定密码。

我使用'./manage.py shell -c':

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

它不使用额外的echo,这样做的好处是你可以将它传递给docker容器执行。而不需要使用Sh -c "…,这会让你陷入“逃离地狱”的境地。

记住第一个是用户名,然后是电子邮件。

如果你有一个自定义的用户模型,你需要导入它而不是auth.models.User

我使用了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 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上得到解释。为了对它进行排序,我用引号括在命令中。然后必须在整个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"

这是我为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——命令选项,但不确定如何在命令脚本中获得换行符。如果没有换行符,if表达式将导致语法错误。

我建议运行数据迁移,这样当迁移应用到项目时,超级用户将作为迁移的一部分被创建。用户名和密码可以设置为环境变量。这在容器中运行应用程序时也很有用(以这个线程为例)。

您的数据迁移将看起来像这样:

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

希望有帮助!

< p > 编辑: 有些人可能会提出这样的问题:如何设置这些环境变量并让Django知道它们。有很多方法,在其他SO帖子中已经回答过,但只是作为一个快速指针,创建.env文件是一个好主意。然后你可以使用python-dotenv包,但如果你已经用pipenv设置了一个虚拟环境,它会自动在你的.env文件中设置envars。同样地,通过docker-compose运行你的应用程序可以读取你的.env文件

进入命令提示符并输入:

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创建超级用户

宾果。

基于亚当Charnock的方法以上解决方案现在作为Python包可用。它需要三个步骤:

  1. 安装:pip install django-createsuperuserwithpassword

  2. 激活:INSTALLED_APPS += ("django_createsuperuserwithpassword", )

  3. < p >应用:

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

That's it.

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')"

从Django 3.0开始,你可以使用默认的createsuperuser --noinput命令,并将所有必需的字段(包括密码)设置为环境变量DJANGO_SUPERUSER_PASSWORDDJANGO_SUPERUSER_USERNAMEDJANGO_SUPERUSER_EMAIL--noinput标志是必需的。

这来自于原始文档:https://docs.djangoproject.com/en/3.0/ref/django-admin/#django-admin-createsuperuser

这是将createsuperuser添加到脚本和管道中最方便的方法。

DJANGO_SUPERUSER_USERNAME=testuser \
DJANGO_SUPERUSER_PASSWORD=testpass \
DJANGO_SUPERUSER_EMAIL="admin@admin.com" \
python manage.py createsuperuser --noinput

createuser命令文档

用shell_plus就简单多了

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

正如其他人提到的,在Django 3.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()
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
)

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)

我喜欢使用无服务器/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.

我这样解决了这个问题。

Wsgi.py文件总是在django项目启动时运行。如果它不存在,我运行create super user命令。

import os


from django.contrib.auth.models import User
from django.core.wsgi import get_wsgi_application


os.environ.setdefault('DJANGO_SETTINGS_MODULE', {settings_file})


application = get_wsgi_application()


users = User.objects.all()
if not users:
User.objects.create_superuser(username="username", email="user@example.com", password="password", is_active=True, is_staff=True)

这里可以添加一个函数。例如;如果这个“;user1"不存在,请添加“;user1”。

对于那些只想在AWS Elastic Beanstalk上托管django网站的人(即使没有docker),并且被困在超级用户部分,创建一个名为 01_migration .sh in .platform >钩子的在postdeploy < / >强的文件并输入以下内容:

#!/bin/bash


source /var/app/venv/*/bin/activate && { python migrate.py createsuperuser --noinput; }

然后,您可以将DJANGO_SUPERUSER_PASSWORD, DJANGO_SUPERUSER_USERNAME, DJANGO_SUPERUSER_EMAIL添加到应用程序环境的配置部分。

然后将以下内容添加到文件夹< >。ebextentions祝辞django.config < / >强

container_commands:
01_chmod1:
command: "chmod +x .platform/hooks/postdeploy/01_migrate.sh"

这将以一种安全的方式创建超级用户,使用相同的逻辑,您还可以通过添加到01_migration .sh文件来运行迁移和collectstatic。

发送命令到dock -compose

几乎相同的答案像以上

docker-compose exec service_name sh -c "
from django.contrib.auth.models import User




username = \"admin\"
email = \"admin@example.com\"
password = \"password\"
User.objects.create_superuser(username, email, password)
"

我没有提到在创建之前验证或检查用户。如果你关心这个,看看上面的答案。

在我的情况下,我们自动使用一些bash, docker, helm,我们有一些问题,转义一些逗号和引号,经过一些尝试/错误后,我们找到了最简单的方法(对我们来说最简单),这一个基于之前共享的文档的行命令就可以做到这一点

DJANGO_SUPERUSER_PASSWORD=12345 DJANGO_SUPERUSER_USERNAME=pacho DJANGO_SUPERUSER_EMAIL=pacho@gmail.com python manage.py createsuperuser --noinput