2009-09-23 57 views
78

我的项目处于早期开发阶段。我经常删除数据库并运行manage.py syncdb从头开始设置我的应用程序。运行Django的时候自动创建一个admin用户./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\[email protected]\ntest\ntest\n

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

+0

'syncdb'已被弃用,有利于数据迁移 – Sdra 2017-01-02 15:10:16

回答

77

我知道这个问题已经被回答,但...

一个更简单的方法是将身份验证模块的数据转储到JSON文件一旦超级用户已经创建:

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

你也可以转储会话的数据:

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

然后,您可以追加会话信息的验证模块转储(也可能增加EXPIRE_DATE所以它不会过期?永远;-)。

从此,你可以使用

/manage.py syncdb --noinput 

创建一个没有交互提示问你一个超级数据库时加载超级用户和他的会话。

+1

这应该是真正的接受答案。最直接的国际海事组织。链接被破坏。 :( – bnjmn 2013-07-31 23:28:32

+4

我应该在哪里放置'initial_data.json',以便'syncdb'找到它?[文档](https://docs.djangoproject.com/en/1.6/ref/django-admin/#loaddata-fixture-夹具)说:_“在每个安装的应用程序的固定装置目录中”_是。例如'./ eggs/Django-1.6.5-py2.7.egg/django/contrib/auth/fixtures'? – user272735 2014-11-07 11:08:11

+2

这是不赞成的因为Django 1.7:https://docs.djangoproject.com/en/1.7/howto/initial-data/#automatically-loading-initial-data-fixtures 现在你可以使用数据迁移。 – 2015-09-25 09:04:09

1

我对此的解决方案是在删除数据库时不删除该授权表。

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

第一:

49

不用删除整个数据库的,只是运行的执行syncdb

这将完成它为你在一个单一的线(每个应用程序)之前删除您的应用程序的表命令将查看您的应用程序并生成所需的SQL以删除表。这个输出然后被传送到dbshel​​l来执行它。

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

python manage.py syncdb 
+2

我喜欢这个答案。感谢您的建议! – ropable 2010-07-19 04:15:19

+0

我也是,谢谢!干净的解决方案,已经使用它有一个干净的转储,我syncdb每当我需要。 – 2013-04-26 22:32:14

2

看看在dumpdata管理命令。例如:

python manage.py dumpdata > initial_data.json 

如果此文件,称为夹具,被命名为initial_data(.xml或以.json),那么syncdb命令将它捡起来,并相应地填充你的表。它仍然会问你是否要创建一个用户,但我相信你可以安全地回答“否”,在此之后它将根据你的夹具填充数据库。

关于这个的更多信息可以在docs找到。

+1

你可以追加 - 输入 选项syncdb以快捷方式交互提示如果你有超级用户和会话信息在你的initial_data.json – philgo20 2010-03-25 14:10:13

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刚刚足够聪明,首先做自己的东西,然后我的情况下,我想用他们的设置搞砸?让我知道你是否知道。 :-)

+0

好东西!谢谢。 – 2009-10-23 03:21:18

+0

最后实现了这个并自动添加了一个钩子来创建我自己的测试用户(如果'settings.DEBUG'为'True')。再次感谢! – 2009-12-05 04:53:48

+4

./manage.py syncdb --noinput – 2012-12-20 23:00:35

0

我使用sqlite作为开发数据库。更改模型类后,只需将sqlite管理器(一个Firefox插件,打开以检查数据)删除相应的表,然后运行manage.py syncdb以重新创建缺少的内容。

11

我已经克服了使用south

它是一个必须有任何的Django开发此功能。

South是一款旨在帮助将更改迁移到活动站点而不破坏信息或数据库结构的工具。生成的更改可以通过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


模式也会有变化 - 数据不被破坏。 Plus南还有更多...

+0

有没有任何消息 - 自动支持南?谢谢。 – alem0lars 2011-08-13 07:39:01

5

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

+0

>未知的命令:'重置' – slikts 2013-11-17 08:50:54

+0

看起来像这是你创建的命令 – tr33hous 2014-01-29 02:57:45

+1

重置已被替换为冲突与Django 1.5 http://stackoverflow.com/questions/15454008/how-to- reset-db-in-django -i-get-a-command-reset-not-found-error – tjb 2014-01-29 20:05:15

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') 
+2

'i sys.argv中的'syncdb': sys.argv.append(' - noinput') ' – TimP 2013-04-18 22:53:56

3

您可以使用django-finalware为你做到这一点。只需添加finalwareINSTALLED_APPS,包括您在settings.py如下:

SITE_SUPERUSER_USERNAME = 'myadmin' 
SITE_SUPERUSER_EMAIL = '[email protected]' 
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),它会自动创建一个超级用户或更新现有的一个给你。

你永远不会被提示创建一个超级用户了。

+0

如果它是由你创建的,那么请添加一个免责声明 – 2016-07-19 17:13:49

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 = '[email protected]' 
      admin_password = 'superuser_password' 
      additional_users = [ 
           ['tempuser', '[email protected]', '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 

我只是显示用户创建代码在这里,但你可以更多地增加这个代码,只要你想。

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="[email protected]") 
    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负责的(测​​试)服务器!

27

的关键是使用--noinput在执行syncdb &的时间,然后用这个one liner创建超级用户

echo "from django.contrib.auth.models import User; User.objects.create_superuser('myadmin', '[email protected]', 'hunter2')" | python manage.py shell 

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

+5

谢谢!这比其他更清晰,更健壮和可扩展,并且非常适合首次运行代码,以及测试脚本和特定部署场景,当然也适用于导致问题的开发场景。 – nealmcb 2014-12-14 14:51:10

7

注:从版本1.7 syncdb命令deprecated。使用migrateinstead

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

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

让说,你碰巧有自己example_app被添加到您的INSTALLED_APPS,你想创建和管理用户管理密码,只要你从头开始运行./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, '[email protected]', 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是一个字符串的Python路径AppConfig子类作为提到here

+2

不幸的是,这不再适用于Django 1.9,因为'django.contrib.auth'在配置时不再可用。这是设计并自1.8以来已被弃用,因此它不可能再回来。这很伤心...我喜欢这个黑客。 – 2016-01-11 20:08:40

+0

好吧,我想出了如何解决你的代码与Django 1.9一起工作!我已经修复了你的答案。感谢张贴它:) – 2016-01-13 17:17:38

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='[email protected]') 


class Migration(migrations.Migration): 

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

    operations = [migrations.RunPython(create_superuser)] 
相关问题