कैसे स्वत: django पर बनानेवाला पदार्थ बनाने के लिए?


128

मैं स्वत: चलने के लिए चाहते हैं manage.py createsuperuserपर django, लेकिन यह तेजी एक डिफ़ॉल्ट पासवर्ड सेट करने का कोई तरीका नहीं है कि वहाँ।

मैं यह कैसे प्राप्त कर सकता हूं? यह django डेटाबेस पर स्वतंत्र होना चाहिए।


1
क्या आपने अपने बनाए गए सुपरयुसर को एक बचत को बचाने और इसे प्रबंधित करने का उपयोग करके लोड करने पर ध्यान दिया है?
टर्बोटॉक्स

1
@turbotux Hendrik F उत्तर आपके द्वारा सुझाए गए दृष्टिकोण के समान है, जो एनवी वर्जन (या फाइलसिस्टम, ...) से मूल्यों (लॉगिन, पासवर्ड ...) को पढ़ने की अतिरिक्त क्षमता के साथ है। मैं अत्यधिक इस सुझाव के बजाय इस दिशा में जाने का सुझाव दूंगा, जब आप आवेदन को पुनः आरंभ करते हैं, तो समस्याएँ होती हैं।
विज्ञापन एन

जवाबों:


145

यदि आप उपयोगकर्ता को सीधे संदर्भित करते हैं, तो आपका कोड उन परियोजनाओं में काम नहीं करेगा जहां AUTH_USER_MODEL सेटिंग को किसी भिन्न उपयोगकर्ता मॉडल में बदल दिया गया है। उपयोगकर्ता बनाने के लिए एक और अधिक सामान्य तरीका होगा:

echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'admin@myproject.com', 'password')" | python manage.py shell

मूल ANSWER

यहां एक सुपरयुसर बनाने के लिए स्क्रिप्ट का एक सरल संस्करण है:

echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'pass')" | python manage.py shell

2
सुपर उपयोगी जब heroku में सुपरयुसर बनाने की कोशिश कर रहा है और आपका नेटवर्क 5000
विक

4
मैं मौजूदा echo "from django.contrib.auth.models import User; User.objects.filter(email='admin@example.com').delete(); User.objects.create_superuser('admin@example.com', 'admin', 'nimda')" | python manage.py shell
सुपरयुसर को हटा दूंगा

12
व्यक्तिगत रूप से मुझे नहीं लगता कि प्रत्येक बिल्ड पर उपयोगकर्ता को हटाना एक अच्छा विचार है। आप कैस्केड डिलीट के माध्यम से किसी भी संबंधित रिकॉर्ड को अनजाने में हटाने का जोखिम उठाते हैं। यदि उपयोगकर्ता पहले से मौजूद है (या मौजूदा उपयोगकर्ता रिकॉर्ड को अपडेट करता है) तो एक सुरक्षित विकल्प बस जमानत करना है।
विल

6
कम से कम Django 1.11 पर। तर्कों का क्रम है ('उपयोगकर्ता नाम', 'ईमेल', 'पास'), नहीं ('ईमेल', 'उपयोगकर्ता नाम', 'पास')। देखें: docs.djangoproject.com/en/1.11/ref/contrib/auth/…
np8

3
from django.contrib.auth.models import Userअब काम नहीं करता है। इसका उपयोग करें:from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'admin@myproject.com', 'my secure password')
५cal

49

मैं खुद इस बात का जवाब खोज रहा था। मैंने एक Django कमांड बनाने का फैसला किया, जो बेस createsuperuserकमांड ( GitHub ) का विस्तार करती है :

from django.contrib.auth.management.commands import createsuperuser
from django.core.management import CommandError


class Command(createsuperuser.Command):
    help = 'Crate a superuser, and allow password to be provided'

    def add_arguments(self, parser):
        super(Command, self).add_arguments(parser)
        parser.add_argument(
            '--password', dest='password', default=None,
            help='Specifies the password for the superuser.',
        )

    def handle(self, *args, **options):
        password = options.get('password')
        username = options.get('username')
        database = options.get('database')

        if password and not username:
            raise CommandError("--username is required if specifying --password")

        super(Command, self).handle(*args, **options)

        if password:
            user = self.UserModel._default_manager.db_manager(database).get(username=username)
            user.set_password(password)
            user.save()

उदाहरण का उपयोग करें:

./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'

यह अभी भी डिफ़ॉल्ट कमांड उपयोग का समर्थन करने का लाभ है, जबकि पासवर्ड निर्दिष्ट करने के लिए गैर-इंटरैक्टिव उपयोग की अनुमति भी देता है।


4
यह सबसे उत्कीर्ण (और स्वीकृत) उत्तर होना चाहिए।
ब्रूनो डेथिलियर्स

काश डिफॉल्ट createsuperuserमें यह --passwordफील्ड भी होता
शादि

1
आप एक उदाहरण के उपयोग को जोड़ सकते हैं:./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'
shadi

2
createsuperuser2इस वर्ग, समारोह में कैसे मैप किया जाता है
श्रीनाथ गणेश

2
@SrinathGanesh पर एक नजर है docs.djangoproject.com/en/1.8/howto/custom-management-commands आप अजगर फ़ाइल को नाम देने की जरूरत है createsuperuser2.pyऔर ऊपर के लिंक से परिभाषित निर्देशिका संरचना में रखें।
इलेक्ट्रोकनिक

43

मैं './manage.py शेल -c' का उपयोग करता हूं:

./manage.py shell -c "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'adminpass')"

यह एक अतिरिक्त प्रतिध्वनि का उपयोग नहीं करता है, इसका लाभ यह है कि आप इसे निष्पादन के लिए एक डॉक कंटेनर में पारित कर सकते हैं। श-सी का उपयोग करने की आवश्यकता के बिना "..." जो आपको नरक से बचने वाले उद्धरण में मिलता है।

और याद रखें कि पहले ईमेल की तुलना में उपयोगकर्ता नाम आता है।

यदि आपके पास एक कस्टम उपयोगकर्ता मॉडल है तो आपको उसे आयात करना होगा और नहीं auth.models.User


1
मेरे लिए काम किया। धन्यवाद!
टिमएच - कोडिडैक्ट

मेरे लिए काम करने के लिए प्रकट नहीं होता है, मैं देख रहा हूं:AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
ब्रोडन

आप एक कस्टम उपयोगकर्ता मॉडल है जब की तरह users.User आपको लगता है कि से और नहीं से आयात करने की जरूरत हैauth.User
yvess

30

मैं एक डाटा माइग्रेशन चलाने का सुझाव दूंगा , इसलिए जब माइग्रेशन प्रोजेक्ट पर लागू होता है, तो माइग्रेशन के एक हिस्से के रूप में एक सुपरयूज़र बनाया जाता है। उपयोगकर्ता नाम और पासवर्ड को पर्यावरण चर के रूप में सेटअप किया जा सकता है। कंटेनर में एक ऐप चलाते समय यह उपयोगी है ( उदाहरण के रूप में इस धागे को देखें )

आपका डेटा माइग्रेशन फिर इस तरह दिखेगा:

import os
from django.db import migrations

class Migration(migrations.Migration):
    dependencies = [
        ('<your_app>', '<previous_migration>'),
    ] # can also be emtpy if it's your first migration

    def generate_superuser(apps, schema_editor):
        from django.contrib.auth.models import User

        DJANGO_DB_NAME = os.environ.get('DJANGO_DB_NAME', "default")
        DJANGO_SU_NAME = os.environ.get('DJANGO_SU_NAME')
        DJANGO_SU_EMAIL = os.environ.get('DJANGO_SU_EMAIL')
        DJANGO_SU_PASSWORD = os.environ.get('DJANGO_SU_PASSWORD')

        superuser = User.objects.create_superuser(
            username=DJANGO_SU_NAME,
            email=DJANGO_SU_EMAIL,
            password=DJANGO_SU_PASSWORD)

        superuser.save()

    operations = [
        migrations.RunPython(generate_superuser),
    ]

उम्मीद है की वो मदद करदे!

EDIT : कुछ लोग यह सवाल उठा सकते हैं कि इन पर्यावरण चर को कैसे सेट किया जाए और Django को उनसे अवगत कराया जाए। बहुत सारे तरीके हैं और अन्य एसओ पोस्ट में इसका उत्तर दिया गया है, लेकिन बस एक त्वरित सूचक के रूप में, एक .envफ़ाइल बनाना एक अच्छा विचार है। आप तब अजगर-डॉटेनव पैकेज का उपयोग कर सकते थे , लेकिन यदि आपके पास पाइपेंव के साथ एक आभासी वातावरण सेटअप है, तो यह स्वचालित रूप से आपकी .envफ़ाइल में एनवियर्स सेट करेगा । इसी तरह, डॉकटर-कम्पोज़ के माध्यम से अपना ऐप चलाना आपकी .envफ़ाइल में पढ़ सकता है ।


1
सुझाव: कृपया इस दृष्टिकोण पर विचार करें । यह एक उच्च गुणवत्ता वाला उत्तर है: यह स्वाभाविक रूप से एड-हॉक पायथन लिपियों की गूंज के बजाय प्रश्न का उत्तर देने के लिए Django की अंतर्निहित कार्यक्षमता का लाभ उठाता है, साथ ही यह स्वाभाविक रूप से स्वीकृत उत्तर की सबसे बड़ी समस्या को संबोधित करता है (एक तैनाती पर केवल एक बार माइग्रेशन लागू होता है , इसलिए उपयोगकर्ता केवल एक बार बनाया गया है)। यह कंटेनर के संदर्भ में खूबसूरती से काम करता है।
विज्ञापन एन

यह एक महान जवाब लगता है। मुझे अभी भी नहीं पता है कि परियोजना में कोड का यह टुकड़ा कहां फिट बैठता है?
पाब्लो रुइज रुइज

यह आपके माइग्रेशन फ़ोल्डर में होना चाहिए, जैसे root/⁨mysite⁩/myapp⁩/⁨migrations⁩- यदि आपका डॉक्स पढ़ता है, तो यह बताता है कि आप एक खाली माइग्रेशन कैसे बना सकते हैं और इसे संशोधित कर सकते हैंpython manage.py makemigrations --empty yourappname
हेंड्रिक एफ

आपको DJANGO_DB_NAME की आवश्यकता क्यों है? इसका कभी उपयोग नहीं किया जाता है।
वक्ष

आपको settings.pyफ़ाइल में .env vars को लोड करने के लिए निम्नलिखित जोड़ने का उल्लेख करना चाहिए :python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
थोवोक

23

Django 3.0 के रूप में आप डिफ़ॉल्ट का उपयोग कर सकते createsuperuser --noinputकमान और वातावरण चर के रूप में (पासवर्ड सहित) सभी आवश्यक फ़ील्ड सेट DJANGO_SUPERUSER_PASSWORD, DJANGO_SUPERUSER_USERNAME, DJANGO_SUPERUSER_EMAILउदाहरण के लिए। --noinputध्वज की आवश्यकता है।

यह मूल डॉक्स से आता है: https://docs.djangoproject.com/en/3.0/ref/django-admin/#django-admin-createsuperuser

और मैंने अभी जाँच की है - यह काम करता है। अब आप आसानी से उन पर्यावरण संस्करणों को निर्यात कर सकते हैं और createsuperuserअपनी स्क्रिप्ट और पाइपलाइन में जोड़ सकते हैं।


14

आप सुपरसिर क्रिएशन के स्वचालन को संभालने के लिए एक साधारण अजगर स्क्रिप्ट लिख सकते हैं। Userमॉडल सिर्फ एक सामान्य Django मॉडल है, तो आप एक स्टैंड-अलोन Django स्क्रिप्ट लिखने की सामान्य प्रक्रिया का पालन करना होगा। उदाहरण के लिए:

import django
django.setup()

from django.contrib.auth.models import User

u = User(username='unique_fellow')
u.set_password('a_very_cryptic_password')
u.is_superuser = True
u.is_staff = True
u.save()

आप createsuperuserकुछ विकल्प भी पारित कर सकते हैं , अर्थात् --noinputऔर --username, जो आपको स्वचालित रूप से नए सुपरयुसर बनाने देगा, लेकिन वे तब तक लॉगिन नहीं कर पाएंगे जब तक आप उनके लिए पासवर्ड सेट नहीं करते।


2
ठीक है cretesuperuser, लेकिन फिर पासवर्ड कैसे सेट करें? मैं इसे एक बैश स्क्रिप्ट के अंदर करना चाहूंगा ...
caneta

10

वर्तमान सबसे अधिक मतदान का जवाब:

  • उपयोगकर्ता को हटाता है यदि यह मौजूद है और जैसा कि टिप्पणियों में @Groady द्वारा नोट किया गया है आप अनजाने में किसी भी संबंधित रिकॉर्ड को एक कैस्केड डिलीट के माध्यम से हटाने का जोखिम उठाते हैं।
  • सुपरसर्वर अस्तित्व को मेल द्वारा फ़िल्टर करना चेक करता है, यदि दो सुपरयुसर के पास एक ही मेल ईश्वर है, जो इसे हटाता है।
  • यह स्क्रिप्ट मापदंडों को अद्यतन करने के लिए बोझिल है: उपयोगकर्ता नाम, पासवर्ड और मेल।
  • यह क्या किया लॉग नहीं करता है।

एक बेहतर संस्करण होगा:

USER="admin"
PASS="super_password"
MAIL="admin@mail.com"
script="
from django.contrib.auth.models import User;

username = '$USER';
password = '$PASS';
email = '$MAIL';

if User.objects.filter(username=username).count()==0:
    User.objects.create_superuser(username, email, password);
    print('Superuser created.');
else:
    print('Superuser creation skipped.');
"
printf "$script" | python manage.py shell

2
स्वीकृत उत्तर की तुलना में बहुत अधिक क्लीनर (बेहतर)। तुम भी इस्तेमाल किया जा सकता था है if not User.objects.filter(username = username).exists(),
फिलिप Fanaro


1

मैंने Tk421 एक लाइनर का उपयोग किया, लेकिन एक त्रुटि संदेश मिला: 1) मुझे लगता है कि मैं Django (1.10) Manager isn't available; 'auth.User' has been swapped for 'users.User'2 के बाद के संस्करण का उपयोग कर रहा हूं । पैरामीटर का क्रम create_superuser गलत था।

इसलिए मैंने इसे बदल दिया:

echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(email='admin@example.com', is_superuser=True).delete(); User.objects.create_superuser('admin', 'admin@example.com', 'nimda')" | python manage.py shell

और जो मैं वास्तव में खुश था, वह यह है कि यह एक हिरोकू की तैनाती पर भी काम करता है:

heroku run echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(email='admin@example.com', is_superuser=True).delete(); User.objects.create_superuser('admin', 'admin@example.com', 'nimda')" | python manage.py shell

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

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

heroku run "echo 'from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(email="""admin@example.com""", is_superuser=True).delete(); User.objects.create_superuser("""admin""", """admin@example.com""", """nimda""")' | python manage.py shell"

1

एक समाधान के आधार पर एडम Charnock के दृष्टिकोण से ऊपर अब तक एक अजगर पैकेज के रूप में उपलब्ध है। इसमें तीन चरण हैं:

  1. इंस्टॉल: pip install django-createsuperuserwithpassword

  2. सक्रिय: INSTALLED_APPS += ("django_createsuperuserwithpassword", )

  3. लागू:

    python manage.py createsuperuserwithpassword \
            --username admin \
            --password admin \
            --email admin@example.org \
            --preserve

बस।


0

बहुत आसान है, पोस्ट सिंकबैंक सिग्नल पर सुनें और कॉन्फ़िगरेशन फ़ाइल से सुपरयूज़र क्रेडेंशियल्स पढ़ें और इसे लागू करें।

चेकआउट django-bootup

https://github.com/un33k/django-bootup/blob/master/README


2
लिंक किसी भी अधिक उपलब्ध नहीं है
Tk421

यह यहां है: github.com/un33k/django-bootup - लेकिन यह कहता है github.com/un33k/django-finalware के
stephendwolff

0

यह छोटा अजगर स्क्रिप्ट एक सामान्य उपयोगकर्ता या सुपरयुसर बना सकता है

#!/usr/bin/env python

import os
import sys
import argparse
import random
import string
import django


def main(arguments):

    parser = argparse.ArgumentParser()
    parser.add_argument('--username', dest='username', type=str)
    parser.add_argument('--email', dest='email', type=str)
    parser.add_argument('--settings', dest='settings', type=str)
    parser.add_argument('--project_dir', dest='project_dir', type=str)
    parser.add_argument('--password', dest='password', type=str, required=False)
    parser.add_argument('--superuser', dest='superuser', action='store_true', required=False)

    args = parser.parse_args()

    sys.path.append(args.project_dir)
    os.environ['DJANGO_SETTINGS_MODULE'] = args.settings
    from django.contrib.auth.models import User
    django.setup()

    username = args.username
    email = args.email
    password = ''.join(random.sample(string.letters, 20)) if args.password is None else args.password
    superuser = args.superuser 

    try:
        user_obj = User.objects.get(username=args.username)
        user_obj.set_password(password)
        user_obj.save()
    except User.DoesNotExist:
    if superuser:
            User.objects.create_superuser(username, email, password)
    else:
        User.objects.create_user(username, email, password)

    print password


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))

- सुपरसुसर और --पासवर्ड अनिवार्य नहीं हैं।

यदि --superuser परिभाषित नहीं है, तो सामान्य उपयोगकर्ता बनाया जाएगा यदि --पासवर्ड परिभाषित नहीं है, तो एक यादृच्छिक पासवर्ड उत्पन्न होगा

    Ex : 
        /var/www/vhosts/PROJECT/python27/bin/python /usr/local/sbin/manage_dja_superusertest.py --username USERNAME --email TEST@domain.tld --project_dir /var/www/vhosts/PROJECT/PROJECT/ --settings PROJECT.settings.env 

0

यह वही है जिसे मैंने हरोकू पोस्ट_डिप्लॉय और एक पूर्वनिर्धारित ऐप.जॉन वैरिएबल के लिए एक साथ दिया था :

if [[ -n "$CREATE_SUPER_USER" ]]; then
    echo "==> Creating super user"
    cd /app/example_project/src
    printf "from django.contrib.auth.models import User\nif not User.objects.exists(): User.objects.create_superuser(*'$CREATE_SUPER_USER'.split(':'))" | python /app/example_project/manage.py shell
fi

इसके साथ आपके पास एक एकल चर हो सकता है:

CREATE_SUPER_USER=admin:admin@example.com:password

मुझे शेल -कमांड विकल्प पसंद है, लेकिन यह सुनिश्चित नहीं है कि कमांड स्क्रिप्ट में न्यूलाइन वर्ण कैसे प्राप्त करें। न्यूलाइन के बिना ifअभिव्यक्ति सिंटैक्स त्रुटि में परिणाम देती है।


0

कमांड प्रॉम्प्ट पर जाएं और टाइप करें:

C:\WINDOWS\system32>pip install django-createsuperuser
Collecting django-createsuperuser
  Downloading https://files.pythonhosted.org/packages/93/8c/344c6367afa62b709adebee039d09229675f1ee34d424180fcee9ed857a5/django-createsuperuser-2019.4.13.tar.gz
Requirement already satisfied: Django>1.0 in c:\programdata\anaconda3\lib\site-packages (from django-createsuperuser) (2.2.1)
Requirement already satisfied: setuptools in c:\programdata\anaconda3\lib\site-packages (from django-createsuperuser) (41.0.1)
Requirement already satisfied: sqlparse in c:\programdata\anaconda3\lib\site-packages (from Django>1.0->django-createsuperuser) (0.3.0)
Requirement already satisfied: pytz in c:\programdata\anaconda3\lib\site-packages (from Django>1.0->django-createsuperuser) (2018.7)
Building wheels for collected packages: django-createsuperuser
  Running setup.py bdist_wheel for django-createsuperuser ... done
  Stored in directory: C:\Users\Arif Khan\AppData\Local\pip\Cache\wheels\0c\96\2a\e73e95bd420e844d3da1c9d3e496c92642a4f2181535440db2
Successfully built django-createsuperuser
Installing collected packages: django-createsuperuser

यदि माइग्रेशन निष्पादित नहीं किया गया है तो django एप्लिकेशन फ़ोल्डर में जाएं और निम्नलिखित पर अमल करें

  1. python manage.py माइग्रेट करें
  2. python manage.py createuperuser बनाता है

फिर बिंगो।


0
python manage.py shell -c "from django.contrib.auth.models import User; \
                           User.objects.filter(username='admin1').exists() or \
                           User.objects.create_superuser('admin1',
                           'admin1@example.com', 'admin1')"

0

वास्तव में यह बहुत आसान है

echo "User.objects.create_superuser('test@test.com', 'test')" | python manage.py shell_plus

जैसा कि दूसरों ने उल्लेख किया है, Django 3.0 के साथ आप पर्यावरण चर के माध्यम से क्रेडेंशियल्स पास कर सकते हैं। हालाँकि यह दृष्टिकोण बहुत अधिक लचीला है क्योंकि यह आपको किसी अन्य अधिक जटिल कार्य को करने की अनुमति देता है जैसे कि सभी परीक्षण उपयोगकर्ताओं को हटाना आदि।

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