web-dev-qa-db-ja.com

Djangoの./manage.py 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\[email protected]\ntest\ntest\nの入力にうんざりしています。

manage.py syncdbを実行しているときにこの手順を自動的にスキップしてプログラムでユーザーを作成するにはどうすればよいですか?

80
a paid nerd

私は質問がすでに回答されていることを知っていますが...

もっと簡単なアプローチは、スーパーユーザーが作成された後、authモジュールのデータをjsonファイルにダンプすることです:

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

セッションデータをダンプすることもできます。

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

その後、セッション情報をauthモジュールのダンプに追加できます(そしておそらくexpire_dateを増やして、期限切れにならないようにします...今まで;-)。

それから、使用できます

/manage.py syncdb --noinput

スーパーユーザーについて尋ねる対話型プロンプトなしでdbを作成するときに、スーパーユーザーとそのセッションをロードします。

80
philgo20

データベース全体を削除する代わりに、syncdbを実行する前にアプリのテーブルを削除するだけです

これにより、アプリケーションごとに1行で実現できます。

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

最初のコマンドはアプリを見て、テーブルを削除するために必要なSQLを生成します。この出力は、dbshel​​lにパイプされて実行されます。

完了したら、syncdbを実行してテーブルを再作成します。

python manage.py syncdb
49
Andre Miller

重要なのは、syncdbの時点で--noinputを使用し、この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/

27
user

私のように、そのスーパーユーザーの質問をすることなく、新鮮なデータベースで本当に開始する機能が必要な場合は、その質問をするシグナルハンドラーを登録解除するだけです。ファイルの一番下を確認してください。

Django/contrib/auth/management/__init__.py

スーパーユーザー機能の登録がどのように実行されるかを確認します。 「models.py」にこのコードを配置すると、「syncdb」でこの登録を取り消すことができ、質問をすることはありませんでした。

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")

このコードが実行されることを保証する方法がわからないafter Django登録を行うコード。アプリかアプリかによって異なると思っていたDjango.contrib.authアプリはINSTALLED_APPSで最初に言及されますが、それらを入れた順序に関係なく機能するようです。 "?またはDjango最初に独自の処理を行うのに十分なだけスマートで、その後、設定をいじりたい場合に使用しますか?

16
Brandon Rhodes

south を使用してこの機能を克服しました

そのaは、Django開発者のために必要です。

Southは、情報やデータベース構造を破壊することなく、変更をライブサイトに移行できるように設計されたツールです。結果の変更はsouthによって追跡でき、生成されたpythonファイルを使用して-代替データベースで同じアクションを実行できます。

開発中、このツールを使用してデータベースの変更をgit追跡し、最初にデータベースを破棄することなくデータベースに変更を加えます。

  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


モデルは変更されます-データは破棄されません。プラスサウスはさらに多くのことを行います...

11
Glycerine

注:バージョン1.7以降、syncdbコマンドは 非推奨 です。 migrate代わりに を使用します。

またDjango 1.7が導入されました AppConfig アプリケーションの初期化プロセスをカスタマイズする手段として。

したがって、Django 1.7であるため、目的を達成する最も簡単な方法はAppConfigのサブクラスを使用することです。

たとえば、example_appに追加された独自のINSTALLED_APPSがあり、作成したいadminユーザーがあるとします./manage.py migrateを最初から実行するときは常にadminパスワードを使用します。また、自動管理ユーザーの作成はdev環境でのみ必要であり、productionでは必要ないと想定しています。

次のコードを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

9
Archibald

manage.py resetコマンドは、作成されたスーパーユーザーを破壊することなくデータベースをリセットします。ただし、データを再インポートする必要があります。

5
tjb

私はすべてのものをリセットするために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()

それは魅力のように機能します!

追伸:このスクリプトを実行する前に、上記のデータベースが担当する(テスト)サーバーを必ず停止してください!

3
Filippo.IOVINE

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)]
3
Sdra

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)を実行すると、自動的にスーパーユーザーが作成されるか、既存のスーパーユーザーが更新されます。

もうスーパーユーザーを作成するように求められることはありません。

3
un33k

dumpdata管理コマンドを見てください。例えば:

python manage.py dumpdata > initial_data.json

フィクスチャと呼ばれるこのファイルの名前がinitial_data(.xmlまたは.json)、その後syncdbコマンドがそれを選択し、それに応じてテーブルにデータを追加します。ユーザーを作成するかどうかを尋ねられますが、「いいえ」と安全に答えることができます。その後、フィクスチャに基づいてデータベースにデータが入力されます。

これに関する詳細情報は docs にあります。

2
Ryan Duffield

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
Cjkjvfnby

pythonソースファイルに直接初期化コードを入力したい場合は、このコードを変更したmanage.pyが役立つかもしれません(Cjkjvfnbyの小さなコードに感謝します!):

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

if __== "__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

ここではユーザー作成コードを示していますが、必要に応じてこのコードをさらに強化できます。

1
Kenial

これに対する私の解決策は、データベースを消去するときにその認証テーブルを削除しないことです。

1
priestc

開発データベースとしてsqliteを使用しています。モデルクラスを変更した後、対応するテーブルをsqlite manager(Firefoxプラグイン、データを検査するために開いている)でドロップし、manage.py syncdb不足しているものを再作成します。

0
yanchenko