我的项目正在早期发展。我经常删除数据库并运行 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 ?

有帮助吗?

解决方案

我知道这个问题已经得到回答,但是...

一种简单的方法是,一旦创建了超级用户,将身份模块数据转储到JSON文件中:

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

您还可以转储会话数据:

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

然后,您可以将会话信息附加到Auth Module转储(并可能增加Expire_date,以免它过期... ever ;-)。

从那时起,您可以使用

/manage.py syncdb --noinput

在创建DB时,没有交互式提示询问您有关超级用户的信息时,加载超级用户和他的会话。

其他提示

不用删除整个数据库,只需在运行SynCDB之前删除应用程序的表

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

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

第一个命令将查看您的应用程序并生成所需的SQL以丢弃表。然后将此输出管道输送到DBSHELL以执行它。

完成后,运行您的SynCDB以重新创建表:

python manage.py syncdb

关键是使用 --noinput 在SynCDB时,然后使用此 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/

如果您希望像我一样能够真正从一个新的数据库开始,而无需询问Superuser问题,那么您只需删除问该问题的信号处理程序即可。查看文件的底部:

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.auth应用程序在installed_apps中首先提及,但是无论我输入什么顺序,它似乎都对我有用。幸运的是,我的应用程序的名字从比“ D”晚的字母开始?还是Django足够聪明,可以先做自己的事情,然后我想在他们的设置上烦恼?让我知道您是否发现。 :-)

我已经克服了此功能

对于任何Django开发人员来说,它都必须拥有。

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

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

  1. easy_install South
  2. 将“南”添加到您的已安装应用

提议在应用程序上首次进行South。

$ python manage.py schemamigration appname --init

这将在该应用程序上启动模式检测。

$ python manage.py migrate appname

这将应用模型更改

  • 数据库将具有新模型。

首次运行后更改模型

$ python manage.py schemamigration appname --auto

$ python manage.py migrate appname


模型将改变 - 数据不会破坏。再加上南部更多...

注意:由于版本1.7 syncdb 命令是 弃用. 。利用 migrate 反而.

也引入了Django 1.7 AppConfig 作为定制应用程序初始化过程的手段。

因此,自Django 1.7以来,实现您想要的最简单方法是采用 AppConfig的子类。

说,你碰巧有自己的 example_app 添加到您的 INSTALLED_APPS 而且您想创建和 行政 用户 行政 每次运行时密码 ./manage.py migrate 从头开始。我还假设仅在 开发 环境 - 不在 生产.

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

# example_app/apps.py

from django.apps import AppConfig
from django.conf import settings
from django.db.models.signals import post_migrate
from django.contrib.auth.apps import AuthConfig


USERNAME = "admin"
PASSWORD = "admin"


def create_test_user(sender, **kwargs):
    if not settings.DEBUG:
        return
    if not isinstance(sender, AuthConfig):
        return
    from django.contrib.auth.models import User
    manager = User.objects
    try:
        manager.get(username=USERNAME)
    except User.DoesNotExist:
        manager.create_superuser(USERNAME, 'x@x.com', PASSWORD)


class ExampleAppConfig(AppConfig):
    name = __package__

    def ready(self):
        post_migrate.connect(create_test_user)

还将以下引用添加到应用程序中的应用程序配置 example_app/__init__.py:

# example_app/__init__.py

default_app_config = 'example_app.apps.ExampleAppConfig'

其中default_app_config是字符串python路径 AppConfig 如上所述 这里.

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

您可以使用 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),它将自动创建超级用户或为您更新现有的产品。

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

由于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)]

我已经解决了创建一个这样的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()

它像魅力一样工作!

PS:请确保在运行此脚本之前先停止(测试)服务器的(测试)服务器!

看一下 dumpdata 管理命令。例如:

python manage.py dumpdata > initial_data.json

如果此文件称为固定装置,则命名为 initial_data (.xml或.json),然后 syncdb 命令会捡起它并相应地填充您的桌子。它仍然会问您是否要创建用户,但我相信您可以安全地回答“否”,此后它将根据您的固定装置填充数据库。

有关此信息的更多信息,请参见 文档.

Developing with sqlite. Clear database by deleting file. Load admin from fixtures.

change manage.py (django 1.4):

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

My solution to this was to just not delete that auth tables when wiping out my database.

If you prefer to type initializing code direct into python source file, this code modified manage.py might help (and thanks for Cjkjvfnby's little code!):

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

I'm just showing the user creation code here, but you can enhance this code more as you want.

I'm using sqlite as a dev database. After changing model classes, just drop the corresponding tables with sqlite manager (a firefox plugin, open to inspect the data anyways) and run manage.py syncdb to recreate what's missing.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top