قم تلقائيا بإنشاء مستخدم مسؤول عند تشغيل Django's ./manage.py

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 بمجرد إنشاء 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 تغييرات قاعدة البيانات الخاصة بي - وإجراء تغيير في قاعدة البيانات دون الحاجة إلى تدميرها أولا.

  1. Easy_Install South.
  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 قدم Appconfig. كوسيلة تخصيص عملية تهيئة التطبيقات.

وبالتالي منذ django 1.7 أبسط طريقة لتحقيق ما تريد هو توظيف AppConfigSubclass الفرعية.

دعونا نقول، تصادفك 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 لإعادة مفقود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top