如果非交互式不存在,如何创建 Django 超级用户?

问题描述 投票:0回答:4

我想通过 Bash 脚本自动创建 Django 用户。我发现这个片段几乎符合我的需要:

echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', '[email protected]', 'pass')" |\
    python manage.py shell

如果用户已经存在,我如何修改它以便它是 nop?

python django bash django-users
4个回答
28
投票

使用
manage.py shell

您可以使用 QuerySet API 方法来检查用户是否存在,如果不存在则创建它。此外,将代码放在 heredoc 中可能更容易:

cat <<EOF | python manage.py shell
from django.contrib.auth import get_user_model

User = get_user_model()  # get the currently active user model,

User.objects.filter(username='admin').exists() or \
    User.objects.create_superuser('admin', '[email protected]', 'pass')
EOF

使用自定义管理命令

另一个更易于维护的选项是为您的 Django 应用程序添加自定义 管理命令。改编文档中的示例,将

yourapp/management/commands/ensure_adminuser.py
编辑为如下所示:

import os
from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = "Creates an admin user non-interactively if it doesn't exist"

    def add_arguments(self, parser):
        parser.add_argument('--username', help="Admin's username")
        parser.add_argument('--email', help="Admin's email")
        parser.add_argument('--password', help="Admin's password")
        parser.add_argument('--no-input', help="Read options from the environment",
                            action='store_true')

    def handle(self, *args, **options):
        User = get_user_model()

        if options['no_input']:
            options['username'] = os.environ['DJANGO_SUPERUSER_USERNAME']
            options['email'] = os.environ['DJANGO_SUPERUSER_EMAIL']
            options['password'] = os.environ['DJANGO_SUPERUSER_PASSWORD']

        if not User.objects.filter(username=options['username']).exists():
            User.objects.create_superuser(username=options['username'],
                                          email=options['email'],
                                          password=options['password'])

然后您可以像这样从 Bash 脚本调用新的自定义命令:

python manage.py ensure_adminuser --username=admin \
    [email protected] \
    --password=pass

2
投票

这个 bash 函数可以解决问题,即使您的应用程序中有自定义用户模型:

create-superuser () {
    local username="$1"
    local email="$2"
    local password="$3"
    cat <<EOF | python manage.py shell
from django.contrib.auth import get_user_model

User = get_user_model()

if not User.objects.filter(username="$username").exists():
    User.objects.create_superuser("$username", "$email", "$password")
else:
    print('User "{}" exists already, not created'.format("$username"))
EOF
}

感谢 Eugene Yarmash 的原创想法。


1
投票

你可以使用 get_or_create()。如果它存在,它什么都不做,否则它会创建一个。

您必须手动将

is_staff
is_superuser
设置为
True


-1
投票

对于大于 3 的 django 版本,使用 bash 文件中的命令创建两个名为 DJANGO_SUPERUSER_USERNAME 和 DJANGO_SUPERUSER_PASSWORD 以及可选的 DJANGO_SUPERUSER_EMAIL 的环境变量和所需的值。然后在 bash 中运行 createsuperuser 命令。这是示例 bash 脚本:

DJANGO_SUPERUSER_USERNAME=admin
DJANGO_SUPERUSER_PASSWORD=pass
[email protected]
python manage.py createsuperuser --no-input

原始文件在这里.

© www.soinside.com 2019 - 2024. All rights reserved.