Django./manage.py syncdb को चलाते समय स्वचालित रूप से एक व्यवस्थापक उपयोगकर्ता बनाएँ


82

मेरा प्रोजेक्ट शुरुआती विकास में है। मैं अक्सर डेटाबेस को हटाता हूं और 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?


syncdbडेटा पलायन के पक्ष में पदावनत कर दिया गया है
Sdra

जवाबों:


80

मुझे पता है कि इस सवाल का जवाब पहले ही दिया जा चुका है लेकिन ...

सुपरसुअर बनने के बाद, एक सामान्य फ़ाइल में एक जेनर फाइल में डंप करने के लिए बहुत सरल तरीका है:

 ./manage.py dumpdata --indent=2 auth > initial_data.json

आप सत्र डेटा भी डंप कर सकते हैं:

./manage.py dumpdata --indent=2 sessions

आप तब सत्र जानकारी को मॉड्यूल मॉड्यूल डंप में जोड़ सकते हैं (और शायद expire_date बढ़ा सकते हैं ताकि यह कभी भी समाप्त न हो ... कभी भी ;-)।

तब से, आप उपयोग कर सकते हैं

/manage.py syncdb --noinput

सुपरसुसर और उसके सत्र को लोड करने के लिए जब कोई इंटरैक्टिव प्रॉम्प्ट के साथ डीबी बनाते हैं तो आपको एक सुपरयुसर के बारे में पूछते हैं।


1
यह वास्तव में स्वीकृत उत्तर होना चाहिए। सबसे सीधा IMO है। लिंक टूट गया है। :(
bnjmn

4
मुझे कहां लगाना चाहिए initial_data.jsonताकि यह syncdbपता चले? डॉक्स कहता है: "प्रत्येक इंस्टॉल किए गए एप्लिकेशन के जुड़नार निर्देशिका में" । यह है कि जैसे ./eggs/Django-1.6.5-py2.7.egg/django/contrib/auth/fixtures?
user272735

2
यह Django 1.7 के बाद से हटा दिया गया है: docs.djangoproject.com/en/1.7/howto/initial-data/… अब आप डेटा माइग्रेशन का उपयोग कर सकते हैं।
जर्मेन चज़ोट

49

अपने पूरे डेटाबेस को हटाने के बजाय, सिंटेकब चलाने से पहले अपने ऐप की तालिकाओं को हटा दें

यह आपके लिए एक लाइन (प्रति ऐप) में इसे पूरा करेगा:

python manage.py sqlclear appname | python manage.py dbshell

पहला कमांड आपके ऐप को देखेगा और तालिकाओं को छोड़ने के लिए आवश्यक एसक्यूएल उत्पन्न करेगा। यह आउटपुट तब इसे निष्पादित करने के लिए dbshell पर पाइप किया गया है।

इसके पूर्ण होने के बाद, तालिकाओं को फिर से बनाने के लिए अपना सिंकबॉन चलाएं:

python manage.py syncdb

2
मुझे यह उत्तर पसंद है। सलाह के लिये धन्यवाद!
रोपने योग्य

मेरी तरफ से भी धन्यवाद! स्वच्छ समाधान, पहले से ही इसका उपयोग करने के लिए एक साफ डंप है जो मुझे जब भी ज़रूरत होती है तब मैं सिंक करता हूं।
आंद्रेई-निकुले पेट्रे

28

कुंजी को --noinputसिंकबब के समय का उपयोग करना है और फिर सुपरयूज़र 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/


5
धन्यवाद! यह दूसरों की तुलना में अधिक स्पष्ट है, अधिक मजबूत और एक्स्टेंसिबल है, और पहली बार जब आप अपना कोड चलाते हैं, साथ ही साथ परीक्षण स्क्रिप्ट और कुछ परिनियोजन परिदृश्य, और निश्चित रूप से प्रश्न के लिए नेतृत्व करने वाले विकास परिदृश्य के लिए उपयोग करते हैं।
nealmcb

16

यदि आप क्षमता चाहते हैं - जैसा कि मैं करता हूं - वास्तव में उस सुपरसुसर प्रश्न को पूछे बिना एक नए डेटाबेस के साथ शुरू करना, तो आप सिग्नल हैंडलर को केवल डी-रजिस्टर कर सकते हैं जो उस प्रश्न को पूछता है। फ़ाइल के बहुत नीचे देखें:

django/contrib/auth/management/__init__.py

यह देखने के लिए कि सुपरसुअर फ़ंक्शन का पंजीकरण कैसे किया जाता है। मैंने पाया कि मैं इस पंजीकरण को उलट सकता हूं, और कभी भी "syncdb" के दौरान प्रश्न नहीं पूछ सकता, अगर मैंने इस कोड को अपने "Google.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 में उल्लेख किया गया है या नहीं, लेकिन यह मेरे लिए काम करने का प्रतीत होता है, भले ही मैंने उन्हें किस क्रम में रखा हो। भाग्यशाली है कि मेरे ऐप का नाम "डी" की तुलना में बाद में एक पत्र के साथ शुरू होता है? या Django सिर्फ अपना सामान पहले करने के लिए पर्याप्त स्मार्ट है, तो मेरी स्थिति में मैं उनकी सेटिंग्स के साथ मिलाना चाहता हूं? अगर आपको पता चल जाए तो मुझे बताएं। :-)


अंत में इसे लागू किया गया और स्वचालित रूप से मेरे परीक्षण उपयोगकर्ता (यदि settings.DEBUGहै True) बनाने के लिए एक हुक जोड़ा गया । एक बार फिर धन्यवाद!
एक पेड nerd

11

मैंने दक्षिण का उपयोग करके इस सुविधा को पार कर लिया है

यह किसी भी django डेवलपर के लिए होना चाहिए।

दक्षिण एक ऐसा उपकरण है जिसे सूचना या डेटाबेस संरचना को नष्ट किए बिना लाइव साइट पर परिवर्तनों को स्थानांतरित करने में मदद करने के लिए डिज़ाइन किया गया है। परिणामस्वरूप परिवर्तनों को दक्षिण द्वारा ट्रैक किया जा सकता है और उत्पन्न अजगर फ़ाइलों का उपयोग करके - वैकल्पिक डेटाबेस पर समान कार्य कर सकते हैं।

विकास के दौरान, मैं इस टूल का उपयोग अपने डेटाबेस परिवर्तनों को ट्रैक करने के लिए करता हूं - और पहले इसे नष्ट करने की आवश्यकता के बिना डेटाबेस में बदलाव करने के लिए।

  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


मॉडल बदल गए होंगे - डेटा नष्ट नहीं हुआ है। साथ ही दक्षिण और भी बहुत कुछ ...


9

नोट: संस्करण 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 वर्णित के रूप में उपवर्ग के लिए एक स्ट्रिंग पायथन मार्ग है


2
दुर्भाग्य से, यह अब Django 1.9 के रूप में काम नहीं करता है, क्योंकि django.contrib.authअब कॉन्फ़िगरेशन समय पर उपलब्ध नहीं है। यह डिजाइन द्वारा है और 1.8 से हटा दिया गया है इसलिए यह कभी भी वापस आने की संभावना नहीं है। जो बहुत दुखद है ... मुझे यह हैक पसंद आया।
एड्रियन पेट्रेस्कु

ठीक है, मुझे पता चला कि Django 1.9 के साथ काम करने के लिए आपके कोड को कैसे ठीक किया जाए! मैंने आपका उत्तर फ़िक्सेस के साथ संपादित कर दिया है। इसे पोस्ट करने के लिए धन्यवाद :)
एड्रियन पेट्रेस्कु

5

manage.py resetआदेश अपने बनाया सुपर उपयोगकर्ता को नष्ट किए बिना अपने डेटाबेस रीसेट कर देगा। हालांकि डेटा को फिर से आयात करने की आवश्यकता है।


1
रीसेट को Django 1.5 stackoverflow.com/questions/15454008/… के
tjb

3

आप इसे करने के लिए 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 <1.7) या ./manage.py migrate(Django> = 1.7), और यह स्वचालित रूप से एक सुपरयूज़र बनाएगा या आपके लिए मौजूदा अपडेट करेगा।

आपको कभी भी सुपरसुअर बनाने के लिए प्रेरित नहीं किया जाता है।


यदि यह आपके द्वारा बनाया गया था, तो कृपया एक अस्वीकरण जोड़ें
Erion S

क्या यह Django> = 2.0 के साथ संगत है?
डुनाटोटोस

@Dunatotatos हाँ यह है। Django वर्जन का सपोर्ट रेपो की .travis.yml फाइल में भी मिल सकता है
un33k

3

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)]

3

मैंने अपने सभी सामान [अद्यतित संस्करण] [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()

यह एक जादू की तरह काम करता है!

PS: अपने स्क्रिप्ट (परीक्षण) सर्वर को बंद करने के लिए सुनिश्चित करें, जहां ऊपर db इस स्क्रिप्ट को चलाने से पहले प्रभारी है!


2

dumpdataप्रबंधन कमांड पर एक नज़र डालें । उदाहरण के लिए:

python manage.py dumpdata > initial_data.json

यदि यह फ़ाइल, जिसे फ़िक्चर कहा जाता है, initial_data(.xml या .json) नाम दिया गया है , तो syncdbकमांड इसे उठाएगा और तदनुसार आपकी तालिकाओं को पॉप्युलेट करेगा। यह तब भी आपसे पूछेगा कि क्या आप एक उपयोगकर्ता बनाना चाहते हैं, लेकिन मेरा मानना ​​है कि आप सुरक्षित रूप से "नहीं" का जवाब दे सकते हैं, जिसके बाद यह आपके फिक्सेशन के आधार पर डेटाबेस को पॉप्युलेट करेगा।

इस पर अधिक जानकारी डॉक्स में पाई जा सकती है ।


1
अगर आप सुपर यूजर और सेशन की जानकारी अपने
शुरुआती_डाटा.जॉसन

2

Sqlite के साथ विकसित करना। फ़ाइल हटाकर डेटाबेस साफ़ करें। जुड़नार से लोड व्यवस्थापक।

बदलाव प्रबंधित करें (django 1.4):

# hack to prevent admin promt
if  len(sys.argv) == 2 and sys.argv[1] == 'syncdb':
    sys.argv.append('--noinput')

2
if 'syncdb' in sys.argv: sys.argv.append('--noinput')
22

1

मेरा समाधान यह था कि जब मेरा डेटाबेस मिटाया जाए तो केवल उस टेबल को डिलीट न करें।


1

यदि आप अजगर सोर्स फाइल में कोड को इनिशियलाइज़ करना टाइप करना पसंद करते हैं, तो यह कोड संशोधित 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

मैं यहाँ केवल उपयोगकर्ता निर्माण कोड दिखा रहा हूँ, लेकिन आप इस कोड को और बढ़ा सकते हैं जैसा आप चाहते हैं।


0

मैं एक देव डेटाबेस के रूप में sqlite का उपयोग कर रहा हूँ। मॉडल कक्षाओं को बदलने के बाद, बस उसी तालिका को स्क्लेलाइट प्रबंधक (एक फ़ायरफ़ॉक्स प्लगइन, डेटा वैसे भी निरीक्षण करने के लिए खुला) के साथ छोड़ दें और manage.py syncdbजो गायब है उसे फिर से बनाने के लिए चलाएं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.