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

a p*_*erd 81 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): 
Run Code Online (Sandbox Code Playgroud)

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

如何在运行时自动跳过此步骤并以编程方式创建用户manage.py syncdb

phi*_*o20 80

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

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

 ./manage.py dumpdata --indent=2 auth > initial_data.json
Run Code Online (Sandbox Code Playgroud)

您还可以转储会话数据:

./manage.py dumpdata --indent=2 sessions
Run Code Online (Sandbox Code Playgroud)

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

从那时起,你可以使用

/manage.py syncdb --noinput
Run Code Online (Sandbox Code Playgroud)

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

  • 我应该在哪里放置`initial_data.json`以便`syncdb`找到它?[文档](https://docs.djangoproject.com/en/1.6/ref/django-admin/#loaddata-fixture-fixture)说:_"在每个已安装应用程序的fixtures目录中"_.那是例如`./ eggs/Django-1.6.5-py2.7.egg/django/contrib/auth/fixtures`? (4认同)
  • 自Django 1.7以来,这已被弃用:https://docs.djangoproject.com/en/1.7/howto/initial-data/#automatically-loading-initial-data-fixtures现在您可以使用数据迁移. (2认同)

And*_*ler 49

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

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

python manage.py sqlclear appname | python manage.py dbshell
Run Code Online (Sandbox Code Playgroud)

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

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

python manage.py syncdb
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案.谢谢你的建议! (2认同)

use*_*ser 27

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

图片来源:http://source.mihelac.org/2009/10/23/django-avoiding-typing-password-for-superuser/

  • 谢谢!这比其他更清晰,更强大和可扩展,并且非常适合使用*第一次*运行代码,以及测试脚本和某些部署方案,当然还有导致问题的开发方案. (5认同)

Bra*_*des 16

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

django/contrib/auth/management/__init__.py
Run Code Online (Sandbox Code Playgroud)

了解如何执行超级用户功能的注册.我发现我可以撤销此注册,并且在"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")
Run Code Online (Sandbox Code Playgroud)

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


Gly*_*ine 11

我用南方克服了这个功能

对于任何django开发者来说都是必备的.

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

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

  1. easy_install南
  2. 将"南"添加到已安装的应用中

建议在应用程序上第一次运行南方.

$ python manage.py schemamigration appname --init

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

$ python manage.py migrate appname

这将应用模型更改

  • 数据库将具有新模型.

第一次运行后更改模型

$ python manage.py schemamigration appname --auto

$ python manage.py migrate appname


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


Arc*_*ald 9

注意:因为版本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)
Run Code Online (Sandbox Code Playgroud)

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

# example_app/__init__.py

default_app_config = 'example_app.apps.ExampleAppConfig'
Run Code Online (Sandbox Code Playgroud)

凡default_app_config是一个字符串的Python路径AppConfig所提到的子类在这里.

  • 不幸的是,这不再适用于Django 1.9,因为`django.contrib.auth`在配置时不再可用.这是设计使然,自1.8以来已被弃用,所以它不可能再回来.哪个很难过......我喜欢这个黑客. (2认同)

tjb*_*tjb 5

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