自動的に作成され管理者ユーザーの実行時にDjangoます。/manage.py syncdb

StackOverflow https://stackoverflow.com/questions/1466827

質問

私のプロジェクトは初期開発。ということでしょう削除データベースの運営 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.

たいのですが自動的にこの手順をスキップ作成ユーザprogramatically実行する場合 manage.py syncdb ?

役に立ちましたか?

解決

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

より簡単なアプローチは、スーパーユーザーが作成されたら、AUTHモジュールデータをJSONファイルにダンプすることです。

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

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

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

次に、セッション情報をAUTHモジュールダンプに追加できます(おそらく有効期限が切れないようにexpire_dateを増やすことができます... Ever ;-)。

それ以降、使用できます

/manage.py syncdb --noinput

スーパーユーザーと彼のセッションをロードするために、インタラクティブなプロンプトがなく、スーパーユーザーについて尋ねます。

他のヒント

削除するのではなく、全体のデータベースは、削除、テーブルのアプリの前に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/

私がそうするように - スーパーユーザーの質問を受けずに新鮮なデータベースから本当に始めたい能力が必要な場合は、その質問をする信号ハンドラーを登録するだけです。ファイルの最下部をチェックしてください。

django/contrib/auth/management/__init__.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")

このコードが実行されることを保証する方法がわかりません 登録を行うDjangoコード。私はそれがあなたのアプリかdjango.contrib.authアプリが最初にinstalled_appsで言及されるかに依存すると思っていましたが、それは私がそれらを入れた注文に関係なく私のために働いているようです。私のアプリの名前が「D」よりも遅い手紙から始まることは幸運ですか?それとも、Djangoは最初に自分のことをするのに十分なほど賢いので、それから私が彼らの設定に悩まされたい場合に備えて私のものですか?ご存知の場合はお知らせください。 :-)

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

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


モデルは変更されます - データは破壊されません。プラスサウスはもっと多くのことをします...

注:バージョン1.7以降 syncdb コマンドはです 非推奨. 。使用する migrate 代わりは.

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

したがって、django1.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:このスクリプトを実行する前に、上記のDBが担当している(テスト)サーバーを必ず停止してください!

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

python manage.py dumpdata > initial_data.json

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

これの詳細については、にあります ドキュメント.

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

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

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 = '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

ここでユーザー作成コードを表示しているだけですが、このコードを必要に応じて強化することができます。

SQLiteを開発データベースとして使用しています。モデルクラスを変更した後、対応するテーブルをでドロップするだけです sqliteマネージャー (とにかくデータを検査するために開いているFirefoxプラグイン)と実行 manage.py syncdb 不足しているものを再現するために。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top