如何在django上自动化createuperuser?

bog*_*dan 100 django

我想自动运行manage.py createsuperuser,django但它接缝无法设置默认密码.

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

Tk4*_*421 131

如果直接引用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
Run Code Online (Sandbox Code Playgroud)

原始答案

这里有一个简单版本的脚本来创建超级用户:

echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'pass')" | python manage.py shell
Run Code Online (Sandbox Code Playgroud)

  • 就个人而言,我不认为在每个版本上删除用户是个好主意.您可能会通过级联删除无意中删除任何关联的记录.更安全的选择是在用户已经存在(或更新现有用户记录)时简单地纾困. (12认同)
  • 至少在Django 1.11上.参数的顺序是('username','email','pass'),not('email','username','pass').请参阅:https://docs.djangoproject.com/en/1.11/ref/contrib/auth/#django.contrib.auth.models.UserManager (5认同)
  • 我会删除现有的超级用户,因此这对每个构建都有效:来自django.contrib.auth.models的```echo'导入User; User.objects.filter(email='admin@example.com').delete( ); User.objects.create_superuser('admin @ example.com','admin','nimda')"| python manage.py shell``` (4认同)
  • `from django.contrib.auth.models import User`不再有效.使用此:`来自django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin','admin @myproject.com','我的安全密码')` (3认同)
  • 尝试在heroku中创建超级用户并且网络阻塞端口5000时超级有用 (2认同)

Ale*_*mov 101

由于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到脚本和管道的最方便的方法。

  • 谢谢你!这非常有帮助,它非常适合与“docker-compose”一起使用,这个答案应该在顶部 (4认同)
  • 这对于 docker 设置非常重要。万分感谢。 (3认同)
  • @PhilO 使用提到的环境变量创建新的“.env”文件。您可以在容器内使用 --env-file https://docs.docker.com/compose/environment-variables/ 将变量附加到 django 容器中,运行“ python manage.py createsuperuser --no-input” (3认同)
  • 你如何将它与 docker compose 一起使用? (2认同)

Ada*_*ock 37

我自己正在寻找答案.我决定创建一个扩展基本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()
Run Code Online (Sandbox Code Playgroud)

使用示例:

./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'
Run Code Online (Sandbox Code Playgroud)

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

  • @SrinathGanesh 看看 https://docs.djangoproject.com/en/1.8/howto/custom-management-commands/ 您需要将 python 文件命名为 `createsuperuser2.py` 并将其放入定义的目录结构中上面的链接。 (3认同)
  • 这应该是最受欢迎(和接受)的答案. (2认同)
  • 您可以添加示例用法:`./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'` (2认同)
  • `createsuperuser2` 如何映射到这个类,函数 (2认同)

yve*_*ess 33

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

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

这不会使用额外的回声,这样做的好处是可以将它传递给docker容器执行.没有必要使用sh -c"......"让你引用逃脱的地狱.

请记住,首先是用户名,而不是电子邮件.

  • 当您有像“users.User”这样的自定义用户模型时,您需要从该模型导入,而不是从“auth.User”导入 (2认同)

Raf*_*den 18

DJANGO_SUPERUSER_USERNAME=testuser \
DJANGO_SUPERUSER_PASSWORD=testpass \
python manage.py createsuperuser --noinput
Run Code Online (Sandbox Code Playgroud)

createuser 命令的文档

  • 这是最简单的解决方案。但是您可以使用其他参数覆盖“noinput”标志:“DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email admin@email.com --noinput” (6认同)
  • 此方法适用于*`Django 3.0`*,后来不适用于*`Django 2.2`* (4认同)
  • 在 Django 4.0 上你不需要传递电子邮件。否则您将收到以下错误:“CommandError:您必须将 --email 与 --noinput 一起使用。” (3认同)

zee*_*kay 13

您可以编写一个简单的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()
Run Code Online (Sandbox Code Playgroud)

您也可以通过createsuperuser几个选项,即--noinput--username,这将让你自动创建新的超级用户,但他们将无法登录,直到你为他们设置密码.

  • 好的`cretesuperuser`,但是如何设置密码呢?我想在bash脚本中做到这一点...... (2认同)
  • 对于Django 1.4+,请按http://stackoverflow.com/a/21149868/91365中的说明进行修改 (2认同)

Hen*_*k F 11

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

然后,您的数据迁移将如下所示:

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),
    ]
Run Code Online (Sandbox Code Playgroud)

希望有帮助!

  • **提示:请考虑这种方法**。这是一个高质量的答案:它自然地利用 Django 的内置功能来回答问题,而不是回显临时的 python 脚本,而且它自然地解决了已接受答案的最大问题(迁移仅在部署上应用一次) ,因此用户仅创建一次)。它在容器环境中运行得非常好。 (5认同)
  • 它应该位于您的迁移文件夹中,例如 `root/mysite/myapp/migrations` - 如果您阅读文档,它会解释如何创建一个空迁移并修改 `python manage.py makemigrations --清空你的应用程序名称` (2认同)

Dav*_*ias 8

目前投票最多的回答:

  • 删除用户(如果存在)并且@Jroady在评论中注明您可能会通过级联删除无意中删除任何相关记录.
  • 通过邮件检查超级用户存在过滤,这样如果两个超级用户拥有相同的邮件,那么上帝知道它删除了哪一个.
  • 更新脚本参数很麻烦:用户名,密码和邮件.
  • 不记录它做了什么.

改进版将是:

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
Run Code Online (Sandbox Code Playgroud)

  • 比接受的答案更干净(更好)。您还可以使用:`if not User.objects.filter(username = username).exists()`, (3认同)

小智 6

我这样解决了这个问题。

wsgi.py 文件始终在 django 项目启动时运行。因此,如果不存在,我在这里运行创建超级用户命令。

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)
Run Code Online (Sandbox Code Playgroud)

可以在这里添加一个功能。例如; 如果此“user1”不存在,请添加“user1”。


小智 5

溶液基于亚当诺克的做法以上可作为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
    
    Run Code Online (Sandbox Code Playgroud)

就是这样。