Otomatik olarak çalıştırmak istiyorum manage.py createsuperuser
, django
ancak varsayılan bir şifre belirlemenin bir yolu olmadığını gösteriyor.
Bunu nasıl elde edebilirim? Django veritabanında bağımsız olması gerekir.
Otomatik olarak çalıştırmak istiyorum manage.py createsuperuser
, django
ancak varsayılan bir şifre belirlemenin bir yolu olmadığını gösteriyor.
Bunu nasıl elde edebilirim? Django veritabanında bağımsız olması gerekir.
Yanıtlar:
Eğer başvuru olursa Kullanıcının doğrudan kod AUTH_USER_MODEL ayarı farklı bir kullanıcı modeli olarak değiştirildi projelerde çalışmaz. Kullanıcıyı oluşturmanın daha genel bir yolu şudur:
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
ORİJİNAL CEVAP
Burada bir süper kullanıcı oluşturmak için komut dosyasının basit bir sürümü var:
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
Artık çalışmıyor. Bunu kullanın: from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'admin@myproject.com', 'my secure password')
Buna kendim bir cevap arıyordum. Temel createsuperuser
komutu ( GitHub ) genişleten bir Django komutu oluşturmaya karar verdim :
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()
Örnek kullanım:
./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'
Bu, varsayılan komut kullanımını desteklemeye devam ederken, aynı zamanda bir parola belirlemek için etkileşimli olmayan kullanıma izin verme avantajına sahiptir.
createsuperuser
bu vardı --password
çok alanı
./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email 'blank@email.com'
createsuperuser2
bu sınıfa nasıl eşlenir, işlev
createsuperuser2.py
ve yukarıdaki bağlantıdan tanımlanan dizin yapısı içine yerleştirin.
'./Manage.py shell -c' kullanıyorum:
./manage.py shell -c "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'adminpass')"
Bu fazladan bir yankı kullanmaz, bu, onu yürütmek için bir docker konteynerine aktarabilmenize yarar. Sh -c "..." kullanmaya gerek kalmadan cehennemden kaçmak için alıntı yapmanıza neden olur.
Ve e-postadan daha önce kullanıcı adının geldiğini unutmayın .
Özel bir kullanıcı modeliniz varsa, bunu içe aktarmanız gerekir, auth.models.User
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
users.User
ondan içe aktarmanız gerekirauth.User
Bir Veri Taşıma çalıştırmanızı öneririm , bu nedenle projeye geçişler uygulandığında, geçişlerin bir parçası olarak bir süper kullanıcı oluşturulur. Kullanıcı adı ve şifre, ortam değişkenleri olarak ayarlanabilir. Bu, bir kapsayıcıda bir uygulama çalıştırırken de yararlıdır ( örnek olarak bu iş parçacığına bakın )
Veri geçişiniz şu şekilde görünecektir:
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),
]
Umarım yardımcı olur!
DÜZENLEME : Bazıları bu ortam değişkenlerinin nasıl ayarlanacağı sorusunu gündeme getirebilir ve Django'nun bunlardan haberdar olmasını sağlayabilir. Birçok yol vardır ve diğer SO gönderilerinde yanıtlanmıştır, ancak hızlı bir işaretçi olarak, bir .env
dosya oluşturmak iyi bir fikirdir. Daha sonra python-dotenv paketini kullanabilirsiniz, ancak pipenv ile sanal bir ortam kurduysanız, .env
dosyanızdaki envvarları otomatik olarak ayarlayacaktır . Benzer şekilde, uygulamanızı docker-compose aracılığıyla çalıştırmak dosyanızı okuyabilir .env
.
root/mysite/myapp/migrations
- belgeleri okursanız, boş bir geçişi nasıl oluşturup değiştirebileceğinizi açıklarpython manage.py makemigrations --empty yourappname
settings.py
dosyaya yüklemek için aşağıdakileri eklemeyi söylemelisiniz :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 itibariyle varsayılan kullanabilirsiniz createsuperuser --noinput
komutu ve ortam değişkenleri olarak (şifre dahil) tüm gerekli alanları ayarlamak DJANGO_SUPERUSER_PASSWORD
, DJANGO_SUPERUSER_USERNAME
, DJANGO_SUPERUSER_EMAIL
örneğin. --noinput
bayrak gerekli.
Bu, orijinal belgelerden gelir: https://docs.djangoproject.com/en/3.0/ref/django-admin/#django-admin-createsuperuser
ve az önce kontrol ettim - çalışıyor. Artık bu ortam değişkenlerini kolayca dışa aktarabilir ve createsuperuser
komut dosyalarınıza ve ardışık düzenlerinize ekleyebilirsiniz .
Süper kullanıcı oluşturmanın otomasyonunu işlemek için basit bir python betiği yazabilirsiniz. User
Eğer tek başına bir Django senaryoyu yazarken normal süreci takip ediyorum böylece modeli, sadece normal Django modelidir. Ör:
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()
Ayrıca createsuperuser
, yeni süper kullanıcılar oluşturmanıza izin veren --noinput
ve --username
gibi birkaç seçeneği de geçebilirsiniz , ancak siz onlar için bir şifre ayarlayana kadar oturum açamazlar.
cretesuperuser
, ama o zaman şifre nasıl ayarlanır? Bunu bir bash betiğinin içinde yapmak istiyorum ...
Mevcut en çok oylanan cevap:
Geliştirilmiş bir sürüm şöyle olacaktır:
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
diğer parametrelerle bayrağın üzerine yazabilirsiniz :DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email admin@email.com --noinput
Tk421'i tek satırlık kullandım ancak şu şekilde bir hata mesajı aldım: 1) Django'nun (1.10) sonraki bir sürümünü kullandığımı düşünüyorum. Manager isn't available; 'auth.User' has been swapped for 'users.User'
2) create_superuser için parametrelerin sırası yanlıştı.
Ben de şununla değiştirdim:
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
ve benim gerçekten memnun olduğum şey, bir heroku dağıtımında da işe yaraması:
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
Bu defalarca güzel çalışacaktır. Bunu bir projenin başlangıcında kullanıyorum, bu yüzden daha sonra meydana gelebilecek korkunç kademeli silmeler için endişelenmeyin.
Bunu local () içinde kumaştan çalıştırmakla ilgili bazı sorunlardan sonra tekrar ziyaret ettim. Görünen o ki boru sembolü, heroku yerine yerel olarak yorumlandığı anlamına geliyordu. Bunu sıralamak için komutu tırnak içine aldım. Daha sonra, tüm python komutunun tek tırnak içindeki python dizeleri için üçlü çift tırnak kullanmak zorunda kaldı.
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"
Adam Charnock'un yukarıdaki yaklaşımına dayanan bir çözüm şu anda bir Python paketi olarak mevcuttur. Üç adımda gerçekleşir:
Yüklemek: pip install django-createsuperuserwithpassword
etkinleştirin: INSTALLED_APPS += ("django_createsuperuserwithpassword", )
Uygulamak:
python manage.py createsuperuserwithpassword \
--username admin \
--password admin \
--email admin@example.org \
--preserve
Bu kadar.
çok kolay, post syncdb sinyalini dinleyin ve bir yapılandırma dosyasından süper kullanıcı kimlik bilgilerini okuyun ve uygulayın.
kontrol etmek django-bootup
Bu küçük python betiği normal bir kullanıcı veya süper kullanıcı oluşturabilir
#!/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 & --password zorunlu değildir.
--Superuser tanımlanmamışsa, normal kullanıcı oluşturulacaktır --parola tanımlanmadıysa, rastgele bir parola oluşturulacaktır
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
Bu, Heroku post_deploy ve önceden tanımlanmış bir app.json değişkeni için birleştirdiğim şey :
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
Bununla tek bir ortam değişkenine sahip olabilirsiniz:
CREATE_SUPER_USER=admin:admin@example.com:password
Ben gibi kabuk --command seçeneği, ama kesin değil nasıl komut komut olsun satır karakteri. Satırsonu olmadan if
ifade sözdizimi hatasına neden olur.
Komut istemine gidin ve şunu yazın:
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
taşıma gerçekleştirilmezse django uygulama klasörüne gidin ve aşağıdakileri yürütün
sonra tombala.
Shell_plus ile aslında çok daha kolay
echo "User.objects.create_superuser('test@test.com', 'test')" | python manage.py shell_plus
Diğerlerinde belirtildiği gibi, Django 3.0 ile kimlik bilgilerini ortam değişkenleri aracılığıyla iletebilirsiniz. Ancak bu yaklaşım çok daha esnektir çünkü tüm test kullanıcılarını kaldırmak gibi daha karmaşık görevleri yerine getirmenize izin verir.