Автоматически создавать пользователя-администратора при запуске ./manage.py syncdb Django.

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

загрузить суперпользователя и его сеанс при создании базы данных без интерактивного запроса о суперпользователе.

Другие советы

Вместо удаления всей базы данных просто удалите таблицы вашего приложения перед запуском 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», если поместил этот код в свой «models.py»:

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 — выполнить те же действия с альтернативной базой данных.

Во время разработки я использую этот инструмент, чтобы отслеживать изменения в базе данных с помощью 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


Модели изменятся – данные не уничтожатся.Плюс юг делает гораздо больше...

Примечание:начиная с версии 1.7 syncdb команда устарел.Использовать migrate вместо.

Также представлен Django 1.7. Конфигурация приложения как средство настройки процесса инициализации приложений.

Таким образом, начиная с 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 — это строковый путь Python к AppConfig подкласс, как уже упоминалось здесь.

А manage.py reset Команда сбросит вашу базу данных, не уничтожая созданного вами суперпользователя.Однако данные необходимо повторно импортировать.

Вы можете использовать Джанго-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 (Джанго <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()

Отлично работает!

P.S.:Обязательно остановите свой (тестовый) сервер, на котором отвечает указанная выше база данных, прежде чем запускать этот скрипт!

Взгляните на 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