قم تلقائيا بإنشاء مستخدم مسؤول عند تشغيل Django's ./manage.py
-
13-09-2019 - |
سؤال
مشروعي في التطوير المبكر. كثيرا ما احذف قاعدة البيانات وتشغيلها 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 بمجرد إنشاء Superuser:
./manage.py dumpdata --indent=2 auth > initial_data.json
يمكنك أيضا تفريغ بيانات الجلسات:
./manage.py dumpdata --indent=2 sessions
يمكنك بعد ذلك إلحلا إلحاق معلومات الجلسة بمجموعة تفريغ وحدة المصادقة (وربما تزيد من expire_date لذلك لا تنتهي صلاحيته ... من أي وقت مضى ؛-).
من ذلك الحين، يمكنك استخدام
/manage.py syncdb --noinput
لتحميل Superuser وجلسته عند إنشاء 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-avoidding-typing-password-forseruser/
إذا كنت تريد القدرة - كما أفعل - ابدأ حقا مع قاعدة بيانات جديدة دون الحصول على سؤال Superuser، فيمكنك فقط إلغاء تسجيل معالج الإشارة الذي يطلب هذا السؤال. تحقق من أسفل الملف:
django/contrib/auth/management/__init__.py
لمعرفة كيفية إجراء تسجيل وظيفة Superuser. لقد وجدت أنه يمكنني عكس هذا التسجيل، ولا سئلت أبدا السؤال أثناء "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 قد تم ذكره أولا في Office_Apps، ولكن يبدو أنه يعمل بالنسبة لي بغض النظر عن النظام الذي وضعته فيه. ربما يتم ذلك أبجديا وأنا محظوظ أن اسم تطبيقي يبدأ بحرف في وقت لاحق من "D"؟ أو هو django فقط الذكية بما فيه الكفاية للقيام بأشياء خاصة بها أولا، ثم الألغام في حالة أريد أن أتهك مع إعداداتهم؟ اسمحوا لي أن أعرف إذا كنت معرفة ذلك. :-)
لقد تغلبت على هذه الميزة باستخدام جنوب
يجب أن يكون لديك أي مطور django.
South هي أداة مصممة للمساعدة في ترحيل التغييرات إلى موقع Live دون تدمير المعلومات أو هيكل قاعدة البيانات. يمكن تتبع التغييرات الناتجة من قبل الجنوب واستخدام ملفات Python التي تم إنشاؤها - يمكن أن تؤدي نفس الإجراءات في قاعدة بيانات بديلة.
أثناء التطوير، استخدم هذه الأداة إلى Git Track تغييرات قاعدة البيانات الخاصة بي - وإجراء تغيير في قاعدة البيانات دون الحاجة إلى تدميرها أولا.
- 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 syncdb
القيادة هو إهمال. وبعد يستخدم migrate
في حين أن.
أيضا django 1.7 قدم Appconfig. كوسيلة تخصيص عملية تهيئة التطبيقات.
وبالتالي منذ django 1.7 أبسط طريقة لتحقيق ما تريد هو توظيف AppConfig
Subclass الفرعية.
دعونا نقول، تصادفك 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
Subclass كما ذكر هنا.
ال manage.py reset
سيؤدي الأمر إلى إعادة تعيين قاعدة البيانات الخاصة بك دون تدمير المستخدم الفائق الذي تم إنشاؤه. ومع ذلك، يجب إعادة استيراد البيانات.
يمكنك استخدام Django-Finterware. للقيام بذلك من أجلك. فقط اضف 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. مسح قاعدة البيانات عن طريق حذف الملف. تحميل المسؤول من المباريات.
تغيير إدارة الأعمال (Django 1.4):
# hack to prevent admin promt
if len(sys.argv) == 2 and sys.argv[1] == 'syncdb':
sys.argv.append('--noinput')
كان الحل الخاص بي لهذا فقط عدم حذف جداول المصادقة عند مسح قاعدة البيانات الخاصة بي.
إذا كنت تفضل كتابة رمز التهيئة Direct Direct في ملف مصدر Python، فقد يساعد هذا الرمز المعدل.
#!/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
لإعادة مفقود.