Автоматически создать пользователя с правами администратора при запуске s./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):
затем вы должны указать имя пользователя, действительный адрес электронной почты и пароль. Это утомительно. Я устал печатать testnx@x.comntestntestn
.
как я могу автоматически пропустить этот шаг и создать пользователя программно при запуске manage.py syncdb
?
15 ответов:
Я знаю, что на этот вопрос уже был дан ответ, но ...
гораздо более простым подходом является сброс данных модуля auth в файл json после создания суперпользователя:
./manage.py dumpdata --indent=2 auth > initial_data.json
вы также можете сбросить данные сеансы:
./manage.py dumpdata --indent=2 sessions
затем вы можете добавить информацию о сеансе в дамп модуля auth (и, вероятно,увеличить 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, который делает регистрацию. Я думал, что это будет зависеть от того ваше приложение или Джанго.ВНО.приложение auth сначала упоминается в INSTALLED_APPS, но, похоже, оно работает для меня независимо от того, в каком порядке я их помещаю. Может быть, они сделаны в алфавитном порядке, и мне повезло, что имя моего приложения начинается с буквы позже, чем "d"? Или Джанго просто достаточно умен, чтобы сделать сначала его собственные вещи, а затем мои, если я хочу испортить их настройки? Дай мне знать, если узнаешь. : -)
Я преодолел эту функцию с помощью Южный
его должно быть для любого разработчика django.
South-это инструмент, предназначенный для переноса изменений на живой сайт без уничтожения информации или структуры базы данных. Полученные изменения могут быть отслежены south и с помощью сгенерированных файлов python-может выполнять те же действия на альтернативной базе данных.
во время разработки я использую этот инструмент для отслеживания изменений в моей базе данных - и внести изменения в базу данных без необходимости сначала ее уничтожить.
- easy_install 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 и устаревший. Используйте
migrate
вместо.также Django 1.7 представил AppConfig как средство настройки процесса инициализации приложений.
таким образом, начиная с Django 1.7 самый простой способ достичь того, что вы хотите, это использовать
AppConfig
с подклассом.Допустим, у вас есть свой
example_app
это добавляется к вашемуINSTALLED_APPS
и вы хотите создать и admin пользователю admin пароль при каждом запуске./manage.py migrate
С нуля. Я также предполагаю, что автоматическое создание пользователя-администратора требуется только в dev окружающая среда - не в производства.добавьте следующий код в
example_app/config.py
# example_app/config.py from django.apps import AppConfig from django.conf import settings from django.contrib.auth.management.commands import createsuperuser from django.db.models import signals from django.contrib.auth.models import User USERNAME = "admin" PASSWORD = "admin" class ExampleAppConfig(AppConfig): name = __package__ def ready(self): if not settings.DEBUG: return from django.contrib.auth import models as auth_models def create_testuser(**kwargs): User = auth_models.User manager = User.objects try: manager.get(username=USERNAME) except User.DoesNotExist: manager.create_superuser(USERNAME, 'x@x.com', PASSWORD) # Prevent interactive question about wanting a superuser created signals.post_migrate.disconnect(createsuperuser, sender=auth_models, dispatch_uid='django.contrib.auth.management.create_superuser') signals.post_migrate.connect(create_testuser, sender=auth_models, dispatch_uid='common.models.create_testuser')
также добавьте следующую ссылку на конфигурацию приложения внутри приложения
example_app/__init__.py
:# example_app/__init__.py default_app_config = 'example_app.config.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 ./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()
это работает как шарм!
С. П.: будьте уверены, чтобы остановить ваш (тестирование) сервера, где выше дБ отвечает перед запуском этого скрипта!
посмотри
dumpdata
команды управления. Например:python manage.py dumpdata > initial_data.json
если этот файл называется приспособление, называется
initial_data
(.xml или .json), тоsyncdb
команда будет забрать его и заполнить ваши таблицы соответственно. Он все равно спросит вас, Хотите ли вы создать пользователя, но я считаю, что вы можете спокойно ответить "нет", после чего он заполнит базу данных на основе вашего устройства.подробнее об этом можно найти в docs.
разработка с помощью sqlite. Очистить базу данных, удалив файл. Загрузите admin из светильников.
изменить manage.py (django 1.4):
# hack to prevent admin promt if len(sys.argv) == 2 and sys.argv[1] == 'syncdb': sys.argv.append('--noinput')
мое решение состояло в том, чтобы просто не удалять эти таблицы auth при уничтожении моей базы данных.
Если вы предпочитаете вводить код инициализации непосредственно в исходный файл 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
Я просто показываю код создания пользователя, но вы можете улучшить этот код, как вы хотите.