2009-09-23 53 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)] 
相關問題