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

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


当前回答

发送命令到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)
"

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

其他回答

我使用'./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

如果您直接引用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

原来的答案

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

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

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

#!/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。

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

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

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

希望有帮助!

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

这是我为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表达式会导致语法错误。