如何在django上自动化createuperuser?

时间:2011-06-05 16:55:18

标签: django

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

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

20 个答案:

答案 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

Documentation for the createuser command

答案 5 :(得分:6)

目前投票最多的回答:

  • 删除用户(如果存在),并且@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

答案 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应用程序文件夹并执行以下操作

  1. python manage.py migration
  2. python manage.py createsuperuser

然后宾果游戏。

答案 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_PASSWORDDJANGO_SUPERUSER_USERNAMEDJANGO_SUPERUSER_EMAIL--noinput标志是必需的。

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

我刚刚检查了它-可以。现在,您可以轻松导出这些环境变量,并将createsuperuser添加到脚本和管道中。

答案 15 :(得分:0)

基于solution的方法Adam Charnockabove现已作为Python软件包提供。这需要三个步骤:

  1. 安装:pip install django-createsuperuserwithpassword

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

  3. 应用:

    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

     

https://github.com/un33k/django-bootup/blob/master/README

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