运行Django的./manage.py syncdb时自动创建管理员用户

时间:2009-09-23 15:40:03

标签: django automation django-syncdb

我的项目处于早期开发阶段。我经常删除数据库并运行manage.py syncdb从头开始设置我的应用程序。

不幸的是,这总是会出现:

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): 

然后您提供了用户名,有效的电子邮件地址和密码。这很乏味。我已经厌倦了输入test\nx@x.com\ntest\ntest\n

如何在运行manage.py syncdb

时自动跳过此步骤并以编程方式创建用户

15 个答案:

答案 0 :(得分:80)

我知道问题已经回答了但是......

更简单的方法是在创建超级用户后将auth模块数据转储到json文件中:

 ./manage.py dumpdata --indent=2 auth > initial_data.json

您也可以转储会话数据:

./manage.py dumpdata --indent=2 sessions

然后,您可以将会话信息附加到auth模块转储(并可能增加expire_date,使其不会过期......永远; - )。

从那时起,您可以使用

/manage.py syncdb --noinput

在创建数据库时加载超级用户和他的会话,没有交互式提示询问超级用户。

答案 1 :(得分:49)

不要删除整个数据库,只需在运行syncdb

之前删除应用程序的表

这将在一行(每个应用程序)为您完成:

python manage.py sqlclear appname | python manage.py dbshell

第一个命令将查看您的应用并生成所需的SQL以删除表。然后将此输出传送到dbshel​​l以执行它。

完成后,运行syncdb重新创建表:

python manage.py syncdb

答案 2 :(得分:27)

关键是在syncdb&时使用--noinput然后使用此one liner创建超级用户

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

信用:http://source.mihelac.org/2009/10/23/django-avoiding-typing-password-for-superuser/

答案 3 :(得分:16)

如果您希望能力 - 就像我一样 - 真正从一个新的数据库开始而不会被问到超级用户的问题,那么您可以取消注册询问该问题的信号处理程序。查看文件的最底部:

django/contrib/auth/management/__init__.py

了解如何执行超级用户函数的注册。我发现我可以撤销此注册,并且在“syncdb”期间永远不会被问到这个问题,如果我将此代码放在我的“models.py”中:

from django.db.models import signals
from django.contrib.auth.management import create_superuser
from django.contrib.auth import models as auth_app

# Prevent interactive question about wanting a superuser created.  (This
# code has to go in this otherwise empty "models" module so that it gets
# processed by the "syncdb" command during database creation.)

signals.post_syncdb.disconnect(
    create_superuser,
    sender=auth_app,
    dispatch_uid = "django.contrib.auth.management.create_superuser")

我不确定如何保证在执行注册的Django代码之后运行此代码。我原以为这取决于你的应用程序或django.contrib.auth应用程序是否首先在INSTALLED_APPS中被提及,但它似乎对我有用,无论我把它们放入的顺序。也许它们是按字母顺序完成的,我是幸运的是,我的应用程序名称以“d”之后的字母开头?或者Django是否足够聪明,可以先做自己的东西,然后我的以防万一我想破坏他们的设置?如果你发现了,请告诉我。 : - )

答案 4 :(得分:11)

我已使用south

克服了此功能

对任何django开发者来说都是必须的。

South是一种工具,旨在帮助将更改迁移到实际站点,而不会破坏信息或数据库结构。可以通过南方跟踪生成的更改并使用生成的python文件 - 可以在备用数据库上执行相同的操作。

在开发过程中,我使用此工具来跟踪我的数据库更改 - 并对数据库进行更改,而无需先破坏它。

  1. easy_install south
  2. 将“南”添加到已安装的应用
  3. 建议在应用上首次使用南方运行

    $ python manage.py schemamigration appname --init

    这将启动该应用程序的架构检测。

    $ python manage.py migrate appname

    这将应用模型更改

    • 数据库将包含新模型。

    首次运行后更改模型

    $ python manage.py schemamigration appname --auto

    $ python manage.py migrate appname


    模型将发生变化 - 数据不会被破坏。 再加上南方还有更多......

答案 5 :(得分:8)

注意:因为版本1.7 syncdb命令是deprecated。使用migrate instead

Django 1.7还引入了AppConfig作为自定义应用程序的方法。初始化过程。

因此,由于Django 1.7实现您想要的最简单方法是使用AppConfig的子类。

假设您恰好拥有自己的example_app已添加到INSTALLED_APPS,而您希望使用 admin 管理员用户>从头开始运行./manage.py migrate时的密码。我还假设只在 dev 环境中需要创建自动管理员用户 - 而不是在生产中。

将以下代码添加到example_app/config.py

# example_app/config.py

from django.apps import AppConfig
from django.conf import settings
from django.contrib.auth.management.commands import createsuperuser
from django.db.models import signals
from django.contrib.auth.models import User


USERNAME = "admin"
PASSWORD = "admin"


class ExampleAppConfig(AppConfig):
name = __package__

def ready(self):
    if not settings.DEBUG:
        return

    from django.contrib.auth import models as auth_models

    def create_testuser(**kwargs):
        User = auth_models.User
        manager = User.objects
        try:
            manager.get(username=USERNAME)
        except User.DoesNotExist:
            manager.create_superuser(USERNAME, 'x@x.com', PASSWORD)

    # Prevent interactive question about wanting a superuser created
    signals.post_migrate.disconnect(createsuperuser, sender=auth_models,
        dispatch_uid='django.contrib.auth.management.create_superuser')
    signals.post_migrate.connect(create_testuser, sender=auth_models,
        dispatch_uid='common.models.create_testuser')

还在应用example_app/__init__.py内添加以下对应用配置的引用:

# example_app/__init__.py

default_app_config = 'example_app.config.ExampleAppConfig'

default_app_config是指向hereAppConfig子类的字符串Python路径。

答案 6 :(得分:5)

manage.py reset命令将重置您的数据库,而不会破坏您创建的超级用户。但是,数据确实需要重新导入。

答案 7 :(得分:3)

您可以使用 django-finalware 为您执行此操作。只需将finalware添加到INSTALLED_APPS,并在settings.py中加入以下内容:

SITE_SUPERUSER_USERNAME = 'myadmin'
SITE_SUPERUSER_EMAIL = 'myadmin@example.com'
SITE_SUPERUSER_PASSWORD  = 'mypass'  # this can be set from a secret file.

# optional object id. Ensures that the superuser id is not set to `1`.
# you can use this as a simple security feature
SITE_SUPERUSER_ID = '343'

然后只运行./manage.py syncdb(Django< 1.7)或./manage.py migrate(Django> = 1.7),它会自动创建超级用户或为您更新现有的超级用户。

永远不会再提示您创建超级用户。

答案 8 :(得分:3)

我已经解决了创建像这样的python脚本重置我的所有东西[更新版本] [1.8]:

import os
import sys

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main.settings.dev")

from django.conf import settings
from django.core import management
from django import get_version

PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
if PROJECT_ROOT not in sys.path:
    sys.path.append(PROJECT_ROOT)

yn = raw_input('Are you sure you want to reset everything? (y/n) ')
if yn == 'y':

    # Drops the db / creates the db
    if settings.DATABASES['default']['ENGINE'].find('mysql') != -1:
        os.system('mysqladmin -uroot -pIronlord0 -f drop db')
        os.system('mysqladmin -uroot -pIronlord0 -f create db')
    elif settings.DATABASES['default']['ENGINE'].find('psycopg2') != -1:
        os.system('psql -U postgres -c "DROP DATABASE db"')
        os.system('psql -U postgres -c "CREATE DATABASE db WITH OWNER = admin"')
    elif settings.DATABASES['default']['ENGINE'].find('sqlite3') != -1:
        try:
            os.remove(os.path.join(PROJECT_ROOT, 'data.db'))
        except:
            pass

    # Getting application handle here otherwise db gets allocated and it can not be destroyed.
    if get_version() > '1.6.10':
        from django.core.wsgi import get_wsgi_application
        application = get_wsgi_application()

    management.call_command('syncdb', interactive=False)

    # Creates admin/password
    from django.contrib.auth.management.commands import changepassword
    management.call_command('createsuperuser', interactive=False, username="admin", email="xxx@example.com")
    command = changepassword.Command()
    command._get_pass = lambda *args: 'password'
    if get_version() >= '1.8':
        command.execute(username="admin")
    else:
        command.execute("admin")


    # Creates the default site entry
    from django.contrib.sites.models import Site
    site = Site.objects.get_current()
    site.domain = 'www.example.com'
    site.name = ' xxx '
    site.save()

它就像一个魅力!

P.S。:在运行此脚本之前,请务必停止上面db负责的服务器(测试)!

答案 9 :(得分:3)

自Django 1.7以来,建议的填充数据库的方法是通过数据迁移。要创建用于创建管理员的数据迁移,您应首先创建一个空迁移:

./manage.py makemigrations --empty myapp --name create-superuser

这将在myapp/migrations/000x__create-superuser.py中创建一个空迁移。编辑文件使其如下所示:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models
from django.contrib.auth.models import User


def create_superuser(apps, schema_editor):
    User.objects.create_superuser(username='myadmin', password='mypassword', email='myemail@gmail.com')


class Migration(migrations.Migration):

    dependencies = [('myapp', '000y_my-previous-migration-file'),]

    operations = [migrations.RunPython(create_superuser)]

答案 10 :(得分:2)

查看dumpdata管理命令。例如:

python manage.py dumpdata > initial_data.json

如果这个名为fixture的文件名为initial_data(。xml或.json),则syncdb命令会将其选中并相应地填充表格。它仍会询问您是否要创建用户,但我相信您可以安全地回答“否”,之后它将根据您的夹具填充数据库。

有关此内容的更多信息,请参阅docs

答案 11 :(得分:2)

使用sqlite开发。 删除文件清除数据库。 从灯具加载管理员。

更改manage.py(django 1.4):

# hack to prevent admin promt
if  len(sys.argv) == 2 and sys.argv[1] == 'syncdb':
    sys.argv.append('--noinput')

答案 12 :(得分:1)

我的解决方案是在擦除我的数据库时不删除该auth表。

答案 13 :(得分:1)

如果你喜欢直接在python源文件中输入初始化代码,这段代码修改后的manage.py可能有所帮助(感谢Cjkjvfnby的小代码!):

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    # set your django setting module here
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") 

    from django.core.management import execute_from_command_line

    # hack to prevent admin prompt
    if len(sys.argv) == 2 and sys.argv[1] == 'syncdb':
        sys.argv.append('--noinput')

    execute_from_command_line(sys.argv)

    # additional process for creation additional user, misc data, and anything
    for arg in sys.argv:
        # if syncdb occurs and users don't exist, create them
        if arg.lower() == 'syncdb':
            print 'syncdb post process...'
            from django.contrib.auth.models import User

            admin_id = 'admin'
            admin_email = 'superuser@mail.com'
            admin_password = 'superuser_password'
            additional_users = [
                                ['tempuser', 'user_email@mail.com', 'tempuser_password']
                                ]

            # admin exists?
            user_list = User.objects.filter(username=admin_id)
            if len(user_list) == 0: 
                print 'create superuser: ' + admin_id
                new_admin = User.objects.create_superuser(admin_id, admin_email, admin_password)

            # additional user exists?
            for additional_user in additional_users:
                user_list = User.objects.filter(username=additional_user[0])
                if len(user_list) == 0: 
                    print 'create additional user: ' + additional_user[0]
                    new_admin = User.objects.create_user(additional_user[0], additional_user[1], additional_user[2])

            # any other data

我只是在这里展示用户创建代码,但您可以根据需要更多地增强此代码。

答案 14 :(得分:0)

我正在使用sqlite作为开发人员数据库。更改模型类之后,只需使用 sqlite manager 删除相应的表(一个firefox插件,打开以检查数据)并运行manage.py syncdb以重新创建缺少的内容。