[django] 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\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


답변

핵심은 --noinputsyncdb시 사용하고 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는 먼저 자체 작업을 수행 할 수있을만큼 똑똑한가요? 알아 내면 알려주세요. 🙂


답변

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

모든 장고 개발자에게는 필수입니다.

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

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

  1. easy_install 남쪽
  2. 설치된 앱에 ‘south’추가

앱에서 처음으로 남쪽을 달리는 것을 제안합니다.

$ python manage.py schemamigration appname --init

그러면 해당 앱에서 스키마 감지가 시작됩니다.

$ python manage.py migrate appname

모델 변경 사항이 적용됩니다.

  • 데이터베이스에는 새 모델이 있습니다.

첫 번째 실행 후 모델 변경

$ python manage.py schemamigration appname --auto

$ python manage.py migrate appname


모델이 변경됩니다-데이터가 파괴되지 않습니다. Plus South는 훨씬 더 많은 일을합니다 …


답변

참고 : 버전 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 언급 된 하위 클래스에 대한 문자열 Python 경로 입니다.


답변

manage.py reset명령은 생성 된 수퍼 유저를 파괴하지 않고 데이터베이스를 재설정합니다. 그러나 데이터를 다시 가져와야합니다.