Djangoの./manage.pysyncdbを実行すると、管理者ユーザーが自動的に作成されます


82

私のプロジェクトは初期の開発段階にあります。私は頻繁にデータベースを削除し、実行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

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


syncdbデータ移行を優先して非推奨になりました
Sdra 2017年

回答:


80

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

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

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

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

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

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

それ以降は、

/manage.py syncdb --noinput

スーパーユーザーについて尋ねるインタラクティブなプロンプトなしでデータベースを作成するときに、スーパーユーザーとそのセッションをロードします。


1
これは本当に受け入れられた答えであるはずです。最も単純なIMO。リンクが壊れています。:(
bnjmn 2013

4
initial_data.jsonそれをsyncdb見つけるためにどこに置くべきですか?ドキュメントには、「インストールされているすべてのアプリケーションのフィクスチャディレクトリ内」と記載されています。それは例えば./eggs/Django-1.6.5-py2.7.egg/django/contrib/auth/fixturesですか?
user272735 2014年

2
これはDjango1.7以降非推奨です:docs.djangoproject.com/en/1.7/howto/initial-data/…これでデータ移行を使用できます。
Germain Chazot 2015

49

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

これにより、(アプリごとに)1行でそれを実現できます。

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

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

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

python manage.py syncdb

2
私はこの答えが好きです。提案をありがとう!
ロープ可能2010

私もありがとう!クリーンなソリューション。必要なときにいつでもsyncdbするクリーンなダンプを作成するためにすでに使用しています。
Andrei-Niculae Petre 2013

28

重要なのは--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/


5
ありがとう!これは他のものよりも明確で、より堅牢で拡張性があり、コードを初めて実行するとき、テストスクリプトや特定の展開シナリオ、そしてもちろん質問につながった開発シナリオで使用するのに最適です。
nealmcb 2014

16

私のように、スーパーユーザーの質問を聞かれることなく、新しいデータベースから実際に開始する機能が必要な場合は、その質問をするシグナルハンドラーの登録を解除するだけです。ファイルの一番下をチェックしてください:

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

このコードが登録を行うDjangoコードのに実行されることを保証する方法がわかりません。あなたのアプリまたはdjango.contrib.authアプリがINSTALLED_APPSで最初に言及されるかどうかに依存すると思っていましたが、それらを入れた順序に関係なく私にとってはうまくいくようです。多分それらはアルファベット順に行われ、私は私のアプリの名前が「d」より後の文字で始まるのは幸運ですか?それとも、Djangoは最初に独自のことを実行し、次に設定をいじりたい場合に備えて私のものを実行するのに十分賢いですか?見つけたら教えてください。:-)


最後に(もしこれを実装し、私自身のテストユーザーを作成するためのフックを追加settings.DEBUGTrue自動的に)。再度、感謝します!
有料オタク

11

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

django開発者にとっては必需品です。

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


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


9

注:バージョン1.7syncdbコマンドは非推奨であるためmigrate 代わりに使用してください。

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

したがって、Django 1.7以降、必要なことを実現する最も簡単な方法は、AppConfigのサブクラスを使用することです。

たとえば、自分にexample_app追加された独自のユーザーがいて、最初から実行するときはいつでも、管理者パスワードを使用してユーザーINSTALLED_APPSを作成および管理したいとします。私はまた、自動管理者ユーザの作成のみで必要とされていることを前提とDEVないで-環境生産./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は、ここで説明するAppConfigサブクラスへの文字列Pythonパスです


2
残念ながら、これはDjango 1.9以降でdjango.contrib.authは機能しなくなりました。これは、構成時に使用できなくなったためです。これは仕様によるものであり、1.8以降非推奨になっているため、戻ってくる可能性はほとんどありません。それはとても悲しいです...私はこのハックが好きでした。
エイドリアンペトレスク2016年

さて、Django1.9で動作するようにコードを修正する方法を見つけました!私はあなたの答えを修正して編集しました。投稿していただきありがとうございます:)
Adrian Petrescu 2016年

5

このmanage.py resetコマンドは、作成したスーパーユーザーを破棄せずにデータベースをリセットします。ただし、データを再インポートする必要があります。


1
リセットは、Djangoの1.5と面一に置き換えられていstackoverflow.com/questions/15454008/...
TJB

3

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

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


それがあなたによって作成された場合は、免責事項を追加してください
Erion S 2016

Django> = 2.0と互換性がありますか?
Dunatotatos

@Dunatotatosはい、そうです。Djangoのバージョンのサポートは、レポの.travis.ymlファイルで見つけることができます
un33k

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='myemail@gmail.com')


class Migration(migrations.Migration):

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

    operations = [migrations.RunPython(create_superuser)]

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="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が担当している(テスト中の)サーバーを必ず停止してください。


2

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

python manage.py dumpdata > initial_data.json

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

これに関する詳細は、ドキュメントに記載されています。


1
initial_data.jsonにスーパーユーザーとセッションの情報がある場合は、syncdbに--noinputオプションを追加して、インタラクティブプロンプトをショートカットできます
philgo20 2010年

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
if 'syncdb' in sys.argv: sys.argv.append('--noinput')
TimP 2013

1

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


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

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.