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.

이 단계를 자동으로 건너 뛰고 실행할 때 프로그래밍 방식으로 사용자를 생성하려면 어떻게해야합니까? manage.py syncdb ?

도움이 되었습니까?

해결책

질문이 이미 답변되었지만 ...

훨씬 간단한 접근 방식은 슈퍼 사용자가 생성되면 인증 모듈 데이터를 JSON 파일에 덤프하는 것입니다.

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

세션 데이터를 덤프 할 수도 있습니다.

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

그런 다음 세션 정보를 인증 모듈 덤프에 추가 할 수 있습니다 (아마도 만료되지 않도록 expire_date를 증가시킬 수 있습니다 ....-).

그때부터 사용할 수 있습니다

/manage.py syncdb --noinput

대화식 프롬프트없이 DB를 만들 때 슈퍼업자와 그의 세션을로드하려면 슈퍼업자에 대해 묻습니다.

다른 팁

전체 데이터베이스를 삭제하는 대신 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

슈퍼 사용자 기능의 등록이 어떻게 수행되는지 확인합니다. 이 코드를 "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가 먼저 자신의 일을 할 수있을만큼 똑똑합니까? 당신이 알아 보면 알려주세요. :-)

이 기능을 사용하여 극복했습니다 남쪽

Django 개발자에게는 반드시 있어야합니다.

South는 정보 나 데이터베이스 구조를 파괴하지 않고 라이브 사이트로 변경 사항을 마이그레이션하는 데 도움이되는 도구입니다. 결과 변경 사항은 South에서 추적 할 수 있으며 생성 된 Python 파일을 사용하여 대체 데이터베이스에서 동일한 작업을 수행 할 수 있습니다.

개발 중에이 도구를 사용하여 데이터베이스 변경을 추적하고 먼저 파괴 할 필요없이 데이터베이스를 변경합니다.

  1. Easy_install South
  2. 설치된 앱에 '남쪽'을 추가하십시오

앱에서 처음으로 South를 제안합니다.

$ 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 대신에.

또한 Django 1.7 도입 AppConfig 응용 프로그램의 초기화 프로세스를 사용자 정의하는 수단으로

따라서 Django 1.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가 문자열 파이썬 경로 인 경우 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)]

나는 이와 같은 파이썬 스크립트를 만들기 위해 모든 것을 재설정하기 위해 파이썬 스크립트를 만들었습니다 [업데이트 된 버전] [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()

그것은 매력처럼 작동합니다!

추신 :이 스크립트를 실행하기 전에 위의 DB가 담당하는 (테스트) 서버를 중지하십시오!

살펴보십시오 dumpdata 관리 명령. 예를 들어:

python manage.py dumpdata > initial_data.json

이 파일이 고정물이라고하는 경우 initial_data (.xml 또는 .json), 그런 다음 syncdb 명령은 그것을 집어 들고 그에 따라 테이블을 채 웁니다. 여전히 사용자를 생성 할 것인지 묻지 만 "아니오"에 안전하게 대답 할 수 있다고 생각합니다. 그 후에는 고정구를 기반으로 데이터베이스를 채 웁니다.

이것에 대한 자세한 정보는 다음을 참조하십시오 문서.

sqlite로 개발. 파일을 삭제하여 데이터베이스를 지우십시오. 비품에서 관리자를로드하십시오.

변경 관리 .py (django 1.4) :

# hack to prevent admin promt
if  len(sys.argv) == 2 and sys.argv[1] == 'syncdb':
    sys.argv.append('--noinput')

이에 대한 내 해결책은 데이터베이스를 삭제할 때 해당 인증 테이블을 삭제하지 않는 것이 었습니다.

초기화 코드를 Python 소스 파일에 직접 입력하려면이 코드 수정 된 관리자가 도움이 될 수 있습니다 (그리고 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를 DEV 데이터베이스로 사용하고 있습니다. 모델 클래스를 변경 한 후 해당 테이블을 SQLITE 관리자 (어쨌든 데이터를 검사하기 위해 열린 Firefox 플러그인) 및 실행 manage.py syncdb 누락 된 것을 재현하기 위해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top