如何在django上自动创buildcreateuperuser?

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

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

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

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

编辑

如注释中所build议的,以下命令将删除并创build超级用户,以便该命令始终适用于每个构build:

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

我用'./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“…” ,它引导你逃离地狱。

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

你可以编写一个简单的python脚本来处理超级用户创build的自动化。 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() 

您还可以传递一些选项--noinput

目前投票最多的答案是:

  • 删除用户,如果存在,并且@Groady在注释中指出,您可能无意中通过级联删除删除了任何关联的logging。
  • 通过邮件检查超级用户存在过滤,所以如果两个超级用户有相同的邮件上帝知道哪一个它删除。
  • 更新脚本参数很麻烦:用户名,密码和邮件。
  • 不logging它做了什么。

一个改进的版本将是:

 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 

我正在寻找自己的答案。 我决定创build一个扩展基础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() 

这具有仍然支持默认命令使用的优点,同时也允许非交互式使用来指定密码。

非常简单,听后syncdb信号,并从configuration文件中读取超级用户凭据并应用它。

结帐django启动

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

这个小python脚本可以创build一个普通用户或超级用户

 #!/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:])) 

– 超级用户& – 密码不是强制性的。

如果未定义–superuser,则创build普通用户。如果未定义–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 

我使用Tk421一个class轮,但得到了一个错误信息:1)我认为我使用更高版本的Django(1.10) Manager isn't available; 'auth.User' has been swapped for 'users.User' Manager isn't available; 'auth.User' has been swapped for 'users.User' )参数的顺序到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()内部的一些麻烦之后,我又重新访问了。 似乎正在发生的事情是,pipe道符号意味着它被本地解释而不是在heroku上。 为了sorting这个我用引号包裹在命令。 然后不得不在整个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"