मैं स्वत: चलने के लिए चाहते हैं manage.py createsuperuser
पर django
, लेकिन यह तेजी एक डिफ़ॉल्ट पासवर्ड सेट करने का कोई तरीका नहीं है कि वहाँ।
मैं यह कैसे प्राप्त कर सकता हूं? यह django डेटाबेस पर स्वतंत्र होना चाहिए।
मैं स्वत: चलने के लिए चाहते हैं manage.py createsuperuser
पर django
, लेकिन यह तेजी एक डिफ़ॉल्ट पासवर्ड सेट करने का कोई तरीका नहीं है कि वहाँ।
मैं यह कैसे प्राप्त कर सकता हूं? यह django डेटाबेस पर स्वतंत्र होना चाहिए।
जवाबों:
यदि आप उपयोगकर्ता को सीधे संदर्भित करते हैं, तो आपका कोड उन परियोजनाओं में काम नहीं करेगा जहां 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
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
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')
मैं खुद इस बात का जवाब खोज रहा था। मैंने एक 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'
यह अभी भी डिफ़ॉल्ट कमांड उपयोग का समर्थन करने का लाभ है, जबकि पासवर्ड निर्दिष्ट करने के लिए गैर-इंटरैक्टिव उपयोग की अनुमति भी देता है।
createsuperuser
में यह --password
फील्ड भी होता
./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'
createsuperuser2
इस वर्ग, समारोह में कैसे मैप किया जाता है
createsuperuser2.py
और ऊपर के लिंक से परिभाषित निर्देशिका संरचना में रखें।
मैं './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
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
users.User
आपको लगता है कि से और नहीं से आयात करने की जरूरत हैauth.User
मैं एक डाटा माइग्रेशन चलाने का सुझाव दूंगा , इसलिए जब माइग्रेशन प्रोजेक्ट पर लागू होता है, तो माइग्रेशन के एक हिस्से के रूप में एक सुपरयूज़र बनाया जाता है। उपयोगकर्ता नाम और पासवर्ड को पर्यावरण चर के रूप में सेटअप किया जा सकता है। कंटेनर में एक ऐप चलाते समय यह उपयोगी है ( उदाहरण के रूप में इस धागे को देखें )
आपका डेटा माइग्रेशन फिर इस तरह दिखेगा:
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
फ़ाइल में पढ़ सकता है ।
root/mysite/myapp/migrations
- यदि आपका डॉक्स पढ़ता है, तो यह बताता है कि आप एक खाली माइग्रेशन कैसे बना सकते हैं और इसे संशोधित कर सकते हैंpython manage.py makemigrations --empty yourappname
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)
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
अपनी स्क्रिप्ट और पाइपलाइन में जोड़ सकते हैं।
आप सुपरसिर क्रिएशन के स्वचालन को संभालने के लिए एक साधारण अजगर स्क्रिप्ट लिख सकते हैं। 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
, जो आपको स्वचालित रूप से नए सुपरयुसर बनाने देगा, लेकिन वे तब तक लॉगिन नहीं कर पाएंगे जब तक आप उनके लिए पासवर्ड सेट नहीं करते।
cretesuperuser
, लेकिन फिर पासवर्ड कैसे सेट करें? मैं इसे एक बैश स्क्रिप्ट के अंदर करना चाहूंगा ...
वर्तमान सबसे अधिक मतदान का जवाब:
एक बेहतर संस्करण होगा:
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
if not User.objects.filter(username = username).exists()
,
DJANGO_SUPERUSER_USERNAME=testuser \
DJANGO_SUPERUSER_PASSWORD=testpass \
python manage.py createsuperuser --noinput
noinput
अन्य DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email admin@email.com --noinput
मैंने 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"
एक समाधान के आधार पर एडम Charnock के दृष्टिकोण से ऊपर अब तक एक अजगर पैकेज के रूप में उपलब्ध है। इसमें तीन चरण हैं:
इंस्टॉल: pip install django-createsuperuserwithpassword
सक्रिय: INSTALLED_APPS += ("django_createsuperuserwithpassword", )
लागू:
python manage.py createsuperuserwithpassword \
--username admin \
--password admin \
--email admin@example.org \
--preserve
बस।
बहुत आसान है, पोस्ट सिंकबैंक सिग्नल पर सुनें और कॉन्फ़िगरेशन फ़ाइल से सुपरयूज़र क्रेडेंशियल्स पढ़ें और इसे लागू करें।
चेकआउट django-bootup
यह छोटा अजगर स्क्रिप्ट एक सामान्य उपयोगकर्ता या सुपरयुसर बना सकता है
#!/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
यह वही है जिसे मैंने हरोकू पोस्ट_डिप्लॉय और एक पूर्वनिर्धारित ऐप.जॉन वैरिएबल के लिए एक साथ दिया था :
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
अभिव्यक्ति सिंटैक्स त्रुटि में परिणाम देती है।
कमांड प्रॉम्प्ट पर जाएं और टाइप करें:
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 एप्लिकेशन फ़ोल्डर में जाएं और निम्नलिखित पर अमल करें
फिर बिंगो।
वास्तव में यह बहुत आसान है
echo "User.objects.create_superuser('test@test.com', 'test')" | python manage.py shell_plus
जैसा कि दूसरों ने उल्लेख किया है, Django 3.0 के साथ आप पर्यावरण चर के माध्यम से क्रेडेंशियल्स पास कर सकते हैं। हालाँकि यह दृष्टिकोण बहुत अधिक लचीला है क्योंकि यह आपको किसी अन्य अधिक जटिल कार्य को करने की अनुमति देता है जैसे कि सभी परीक्षण उपयोगकर्ताओं को हटाना आदि।