Sudahkah Anda melihat ke dalam hanya menyimpan perlengkapan superuser yang Anda buat dan memuatnya menggunakan manage.py?
turbotux
1
@turbotux Hendrik F jawaban mengambil pendekatan yang mirip dengan apa yang Anda sarankan, dengan kemampuan tambahan untuk membaca nilai (login, password ...) dari env vars (atau filesystem, ...). Saya sangat menyarankan untuk pergi ke arah ini daripada skrip python ad-hoc, yang memiliki masalah saat Anda memulai ulang aplikasi.
Ad N
Jawaban:
145
Jika Anda mereferensikan Pengguna secara langsung, kode Anda tidak akan berfungsi dalam proyek yang setelan AUTH_USER_MODEL telah diubah ke model pengguna lain. Cara yang lebih umum untuk membuat pengguna adalah:
sangat berguna saat mencoba membuat pengguna super di heroku dan port blok jaringan Anda 5000
Vic
4
Saya akan menghapus superuser yang ada, jadi ini berlaku untuk setiap build: echo "from django.contrib.auth.models import User; User.objects.filter(email='[email protected]').delete(); User.objects.create_superuser('[email protected]', 'admin', 'nimda')" | python manage.py shell
Montaro
12
Secara pribadi, menurut saya menghapus pengguna di setiap build adalah ide yang bagus. Anda berisiko secara tidak sengaja menghapus rekaman terkait melalui penghapusan bertingkat. Opsi yang lebih aman adalah dengan melakukan bail-out jika pengguna sudah ada (atau memperbarui catatan Pengguna yang ada).
from django.contrib.auth.models import Usertidak lagi berfungsi. Gunakan ini: from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', '[email protected]', 'my secure password')
dcalde
49
Saya sedang mencari jawaban untuk ini sendiri. Saya memutuskan untuk membuat perintah Django yang memperluas createsuperuserperintah dasar ( GitHub ):
from django.contrib.auth.management.commands import createsuperuser
from django.core.management importCommandErrorclassCommand(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 andnot username:raiseCommandError("--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()
Ini tidak menggunakan echo ekstra, ini memiliki keuntungan bahwa Anda dapat meneruskannya ke kontainer buruh pelabuhan untuk dieksekusi. Tanpa perlu menggunakan sh -c "..." yang membuat Anda dikutip dari neraka.
Dan ingat bahwa yang pertama datang adalah nama pengguna, daripada email.
Jika Anda memiliki model pengguna khusus, Anda perlu mengimpornya dan tidak auth.models.User
Tampaknya tidak berhasil untuk saya, saya melihat:AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
Brodan
bila Anda memiliki model pengguna ubahsuaian seperti users.User Anda perlu mengimpor dari model itu dan bukan dariauth.User
yvess
30
Saya akan menyarankan menjalankan Migrasi Data , jadi ketika migrasi diterapkan ke proyek, pengguna super dibuat sebagai bagian dari migrasi. Nama pengguna dan kata sandi dapat diatur sebagai variabel lingkungan. Ini juga berguna saat menjalankan aplikasi dalam wadah (lihat utas ini sebagai contoh)
Migrasi data Anda akan terlihat seperti ini:
import os
from django.db import migrations
classMigration(migrations.Migration):
dependencies =[('<your_app>','<previous_migration>'),]# can also be emtpy if it's your first migrationdef generate_superuser(apps, schema_editor):from django.contrib.auth.models importUser
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),]
Semoga membantu!
EDIT : Beberapa mungkin memunculkan pertanyaan bagaimana menyetel variabel lingkungan ini dan membuat Django menyadarinya. Ada banyak cara dan sudah terjawab di posting SO lainnya, tetapi hanya sebagai penunjuk cepat, membuat .envfile adalah ide yang bagus. Anda kemudian dapat menggunakan paket python-dotenv , tetapi jika Anda telah menyiapkan lingkungan virtual dengan pipenv, itu akan secara otomatis mengatur envars di .envfile Anda . Demikian pula, menjalankan aplikasi Anda melalui docker-compose dapat membaca .envfile Anda .
TIP: Harap pertimbangkan pendekatan ini . Ini adalah jawaban berkualitas tinggi: ini secara alami memanfaatkan fungsionalitas bawaan Django untuk menjawab pertanyaan alih-alih menggemakan skrip python ad-hoc, ditambah secara alami menjawab masalah terbesar dari jawaban yang diterima (migrasi diterapkan hanya sekali pada penerapan , jadi pengguna hanya dibuat sekali). Ia bekerja dengan baik dalam konteks wadah.
Ad N
Sepertinya ini jawaban yang bagus. Saya masih tidak tahu di bagian mana dalam proyek ini potongan kode ini cocok?
Pablo Ruiz Ruiz
Ini harus ada di folder migrasi Anda, misalnya root/mysite/myapp/migrations- jika Anda membaca dokumen, ini menjelaskan bagaimana Anda dapat membuat migrasi kosong dan mengubahnyapython manage.py makemigrations --empty yourappname
Hendrik F
Mengapa Anda membutuhkan DJANGO_DB_NAME? itu tidak pernah digunakan.
thoroc
Anda harus menyebutkan untuk menambahkan yang berikut untuk memuat .env vars ke settings.pyfile:python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
thoroc
23
Pada Django 3.0 dapat Anda gunakan standar createsuperuser --noinputperintah dan mengatur semua bidang yang diperlukan (termasuk password) sebagai variabel lingkungan DJANGO_SUPERUSER_PASSWORD, DJANGO_SUPERUSER_USERNAME, DJANGO_SUPERUSER_EMAILmisalnya. --noinputbendera diperlukan.
dan saya baru saja memeriksanya - berhasil. Sekarang Anda dapat dengan mudah mengekspor variabel lingkungan tersebut dan menambahkannya createsuperuserke skrip dan pipeline Anda.
Anda dapat menulis skrip python sederhana untuk menangani otomatisasi pembuatan superuser. The UserModel hanya model Django normal, sehingga Anda akan mengikuti proses normal menulis Django naskah berdiri sendiri. Ex:
Anda juga dapat memberikan createsuperuserbeberapa opsi, yaitu --noinputdan --username, yang memungkinkan Anda membuat superuser baru secara otomatis, tetapi mereka tidak akan dapat masuk hingga Anda menyetel kata sandi untuk mereka.
Ok untuk cretesuperuser, tapi bagaimana cara mengatur kata sandinya? Saya ingin melakukannya di dalam skrip bash ...
caneta
10
Jawaban yang paling banyak dipilih saat ini:
Menghapus pengguna jika ada dan seperti yang dicatat oleh @Groady dalam komentar, Anda berisiko secara tidak sengaja menghapus semua catatan terkait melalui penghapusan bertingkat.
Memeriksa pemfilteran keberadaan pengguna super melalui surat jadi jika dua pengguna super memiliki surat yang sama, tuhan tahu mana yang dihapusnya.
Sulit untuk memperbarui parameter skrip: nama pengguna, kata sandi, dan surat.
Ini adalah solusi termudah. Tetapi Anda dapat menimpa noinputbendera dengan parameter lain:DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email [email protected] --noinput
dannydedog
1
Saya menggunakan Tk421 satu liner tetapi mendapat pesan kesalahan sebagai: 1) Saya pikir saya menggunakan versi Django (1.10) Manager isn't available; 'auth.User' has been swapped for 'users.User'2) urutan parameter untuk create_superuser salah.
dan yang sangat saya sukai adalah ini berfungsi pada penerapan heroku juga:
heroku run echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(email='[email protected]', is_superuser=True).delete(); User.objects.create_superuser('admin', '[email protected]', 'nimda')"| python manage.py shell
Ini akan bekerja dengan baik berulang kali. Saya menggunakannya di awal proyek jadi jangan khawatir tentang penghapusan bertingkat mengerikan yang mungkin terjadi nanti.
Saya telah mengunjungi kembali setelah beberapa masalah dengan menjalankan ini di dalam lokal () dari kain. apa yang tampaknya terjadi adalah bahwa simbol pipa berarti ditafsirkan secara lokal daripada di heroku. Untuk mengurutkan ini, saya membungkus perintah dalam tanda kutip. Kemudian harus menggunakan tanda kutip ganda rangkap tiga untuk string python di dalam tanda kutip tunggal dari seluruh perintah python.
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"
Saya suka opsi shell --command , tetapi tidak yakin bagaimana mendapatkan karakter baris baru dalam skrip perintah. Tanpa baris baru, ifekspresi menghasilkan kesalahan sintaksis.
Seperti yang disebutkan orang lain, dengan Django 3.0 Anda dapat meneruskan kredensial melalui variabel lingkungan. Namun pendekatan ini jauh lebih fleksibel karena memungkinkan Anda melakukan tugas lain yang lebih rumit seperti menghapus semua pengguna pengujian, dll.
Jawaban:
Jika Anda mereferensikan Pengguna secara langsung, kode Anda tidak akan berfungsi dalam proyek yang setelan AUTH_USER_MODEL telah diubah ke model pengguna lain. Cara yang lebih umum untuk membuat pengguna adalah:
JAWABAN ASLI
Di sini ada versi sederhana dari script untuk membuat superuser:
sumber
echo "from django.contrib.auth.models import User; User.objects.filter(email='[email protected]').delete(); User.objects.create_superuser('[email protected]', 'admin', 'nimda')" | python manage.py shell
from django.contrib.auth.models import User
tidak lagi berfungsi. Gunakan ini:from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', '[email protected]', 'my secure password')
Saya sedang mencari jawaban untuk ini sendiri. Saya memutuskan untuk membuat perintah Django yang memperluas
createsuperuser
perintah dasar ( GitHub ):Contoh penggunaan:
Keuntungannya adalah tetap mendukung penggunaan perintah default, sementara juga memungkinkan penggunaan non-interaktif untuk menentukan sandi.
sumber
createsuperuser
memiliki--password
bidang ini juga./manage.py createsuperuser2 --username test1 --password 123321 --noinput --email '[email protected]'
createsuperuser2
dipetakan ke kelas ini, fungsicreatesuperuser2.py
dan menempatkannya ke dalam struktur direktori yang ditentukan dari tautan di atas.Saya menggunakan './manage.py shell -c':
Ini tidak menggunakan echo ekstra, ini memiliki keuntungan bahwa Anda dapat meneruskannya ke kontainer buruh pelabuhan untuk dieksekusi. Tanpa perlu menggunakan sh -c "..." yang membuat Anda dikutip dari neraka.
Dan ingat bahwa yang pertama datang adalah nama pengguna, daripada email.
Jika Anda memiliki model pengguna khusus, Anda perlu mengimpornya dan tidak
auth.models.User
sumber
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
users.User
Anda perlu mengimpor dari model itu dan bukan dariauth.User
Saya akan menyarankan menjalankan Migrasi Data , jadi ketika migrasi diterapkan ke proyek, pengguna super dibuat sebagai bagian dari migrasi. Nama pengguna dan kata sandi dapat diatur sebagai variabel lingkungan. Ini juga berguna saat menjalankan aplikasi dalam wadah (lihat utas ini sebagai contoh)
Migrasi data Anda akan terlihat seperti ini:
Semoga membantu!
EDIT : Beberapa mungkin memunculkan pertanyaan bagaimana menyetel variabel lingkungan ini dan membuat Django menyadarinya. Ada banyak cara dan sudah terjawab di posting SO lainnya, tetapi hanya sebagai penunjuk cepat, membuat
.env
file adalah ide yang bagus. Anda kemudian dapat menggunakan paket python-dotenv , tetapi jika Anda telah menyiapkan lingkungan virtual dengan pipenv, itu akan secara otomatis mengatur envars di.env
file Anda . Demikian pula, menjalankan aplikasi Anda melalui docker-compose dapat membaca.env
file Anda .sumber
root/mysite/myapp/migrations
- jika Anda membaca dokumen, ini menjelaskan bagaimana Anda dapat membuat migrasi kosong dan mengubahnyapython manage.py makemigrations --empty yourappname
settings.py
file:python # loading .env from dotenv import load_dotenv from pathlib import Path env_path = Path('.', '.env') load_dotenv(dotenv_path=env_path)
Pada Django 3.0 dapat Anda gunakan standar
createsuperuser --noinput
perintah dan mengatur semua bidang yang diperlukan (termasuk password) sebagai variabel lingkunganDJANGO_SUPERUSER_PASSWORD
,DJANGO_SUPERUSER_USERNAME
,DJANGO_SUPERUSER_EMAIL
misalnya.--noinput
bendera diperlukan.Ini berasal dari dokumen asli: https://docs.djangoproject.com/en/3.0/ref/django-admin/#django-admin-createsuperuser
dan saya baru saja memeriksanya - berhasil. Sekarang Anda dapat dengan mudah mengekspor variabel lingkungan tersebut dan menambahkannya
createsuperuser
ke skrip dan pipeline Anda.sumber
Anda dapat menulis skrip python sederhana untuk menangani otomatisasi pembuatan superuser. The
User
Model hanya model Django normal, sehingga Anda akan mengikuti proses normal menulis Django naskah berdiri sendiri. Ex:Anda juga dapat memberikan
createsuperuser
beberapa opsi, yaitu--noinput
dan--username
, yang memungkinkan Anda membuat superuser baru secara otomatis, tetapi mereka tidak akan dapat masuk hingga Anda menyetel kata sandi untuk mereka.sumber
cretesuperuser
, tapi bagaimana cara mengatur kata sandinya? Saya ingin melakukannya di dalam skrip bash ...Jawaban yang paling banyak dipilih saat ini:
Versi yang ditingkatkan adalah:
sumber
if not User.objects.filter(username = username).exists()
,Dokumentasi untuk perintah createuser
sumber
noinput
bendera dengan parameter lain:DJANGO_SUPERUSER_PASSWORD=testpass python manage.py createsuperuser --username testuser --email [email protected] --noinput
Saya menggunakan Tk421 satu liner tetapi mendapat pesan kesalahan sebagai: 1) Saya pikir saya menggunakan versi Django (1.10)
Manager isn't available; 'auth.User' has been swapped for 'users.User'
2) urutan parameter untuk create_superuser salah.Jadi saya menggantinya dengan:
dan yang sangat saya sukai adalah ini berfungsi pada penerapan heroku juga:
Ini akan bekerja dengan baik berulang kali. Saya menggunakannya di awal proyek jadi jangan khawatir tentang penghapusan bertingkat mengerikan yang mungkin terjadi nanti.
Saya telah mengunjungi kembali setelah beberapa masalah dengan menjalankan ini di dalam lokal () dari kain. apa yang tampaknya terjadi adalah bahwa simbol pipa berarti ditafsirkan secara lokal daripada di heroku. Untuk mengurutkan ini, saya membungkus perintah dalam tanda kutip. Kemudian harus menggunakan tanda kutip ganda rangkap tiga untuk string python di dalam tanda kutip tunggal dari seluruh perintah python.
sumber
Sebuah solusi berdasarkan Adam Charnock pendekatan 's atas tersedia sebagai paket Python sekarang. Dibutuhkan tiga langkah:
Install:
pip install django-createsuperuserwithpassword
Mengaktifkan:
INSTALLED_APPS += ("django_createsuperuserwithpassword", )
Menerapkan:
Itu dia.
sumber
sangat mudah, dengarkan sinyal syncdb pos dan baca kredensial superuser dari file konfigurasi dan terapkan.
sumber
Skrip python kecil ini bisa membuat pengguna biasa atau superuser
--superuser & --password tidak wajib diisi.
Jika --superuser tidak ditentukan, pengguna biasa akan dibuat Jika --password tidak ditentukan, kata sandi acak akan dibuat
sumber
Inilah yang saya buat untuk Heroku post_deploy dan variabel app.json yang telah ditentukan :
Dengan ini, Anda dapat memiliki satu variabel env:
Saya suka opsi shell --command , tetapi tidak yakin bagaimana mendapatkan karakter baris baru dalam skrip perintah. Tanpa baris baru,
if
ekspresi menghasilkan kesalahan sintaksis.sumber
Pergi ke command prompt dan ketik:
jika tidak dijalankan migrasi maka pergi ke folder aplikasi django dan jalankan berikut ini
lalu bingo.
sumber
sumber
Dengan shell_plus sebenarnya jauh lebih mudah
Seperti yang disebutkan orang lain, dengan Django 3.0 Anda dapat meneruskan kredensial melalui variabel lingkungan. Namun pendekatan ini jauh lebih fleksibel karena memungkinkan Anda melakukan tugas lain yang lebih rumit seperti menghapus semua pengguna pengujian, dll.
sumber