Menulis perintah django-admin
penyesuaian¶
Aplikasi dapat mendaftarkan tindakan mereka sendiri dengan manage.py
. Sebagai contoh, anda mungkin ingin menambahkan sebuah tindakan manage.py
untuk sebuah aplikasi Django yang anda sedang sebarkan. Dalam dokumen ini, kami akan membangun sebuah penyesuaian perintah closepoll
untuk aplikasi polls
dari tutorial.
Untuk melakukan ini, tambahkan direktori management/commands
ke aplikasi. Django akan mendaftarkan sebuah perintah manage.py
untuk setiap modul Python dalam direktori tersebut yang namanya tidak dimulai dengan garis bawah. Sebagai contoh:
polls/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
_private.py
closepoll.py
tests.py
views.py
Dalam contoh ini, perintah closepoll
akan dibuat tersedia pada setiap proyek yang menyertakan aplikasi polls
dalam INSTALLED_APPS
.
Modul _private.py
tidak akan tersedia sebagai perintah pengelolaan.
Modul closepoll.py
mempunyai hanya satu persyaratan -- itu harus ditentukan sebuah kelas Command
yang memperpanjang BaseCommand
atau satu dari subclasses nya.
Tulisan berdiri sendiri
Penyesuaian pengelolaan perintah adalah khususnya berguna untuk menjalankan tulisan berdiri sendiri atau untuk tulisan yang secara berkala dijalankan dari panel kendali UNIX crontab atau Windows scheduled tasks.
Untuk menerapkan perintah, sunting polls/management/commands/closepoll.py
untuk kelihatan seperti ini:
from django.core.management.base import BaseCommand, CommandError
from polls.models import Question as Poll
class Command(BaseCommand):
help = 'Closes the specified poll for voting'
def add_arguments(self, parser):
parser.add_argument('poll_id', nargs='+', type=int)
def handle(self, *args, **options):
for poll_id in options['poll_id']:
try:
poll = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise CommandError('Poll "%s" does not exist' % poll_id)
poll.opened = False
poll.save()
self.stdout.write(self.style.SUCCESS('Successfully closed poll "%s"' % poll_id))
Catatan
Ketika anda menggunakan pengelolaan perintah dan berharap untuk menyediakan keluaran tempat tuts, anda harus menulis ke self.stdout
dan self.stderr
, daripada mencetak ke stdout
and stderr
secara langsung. Dengan menggunakan proxi ini, dia menjadi lebih mudah untuk mencoba penyesuaian perintah anda. Catat juga bahwa anda tidak butuh mengakhiri pesan dengan karakter baris baru, dia akan ditambahkan otomatis, meskipun anda menentukan parameter ending
:
self.stdout.write("Unterminated line", ending='')
Perintah penyesuaian baru dapat dipanggil menggunakan python manage.py closepoll <poll_id>
.
Cara handle()
mengambil satu atau lebih poll_ids
dan mengatur poll.opened
ke False
untuk masing-masing. Jika pengguna memberi petunjuk tiap jejak pendapat yang tidak ada, sebuah CommandError
akan muncul. Atribut poll.opened
tidak ada dalam tutorial dan telah ditambahkan ke polls.models.Question
untuk contoh ini.
Menerima argumen pilihan¶
closepoll
yang sama dapat dengan mudah dirubah untuk menghapus jejak pendapat yang diberikan daripada menutupnya dengan menerima tambahan pilihan baris perintah. Penyesuaian pilihan ini dapat ditambahkan dalam cara add_arguments()
seperti ini:
class Command(BaseCommand):
def add_arguments(self, parser):
# Positional arguments
parser.add_argument('poll_id', nargs='+', type=int)
# Named (optional) arguments
parser.add_argument(
'--delete',
action='store_true',
dest='delete',
help='Delete poll instead of closing it',
)
def handle(self, *args, **options):
# ...
if options['delete']:
poll.delete()
# ...
Pilihan (delete
dalam contoh kami) tersedia dalam pilihan parameter perintah dari cara penanganan. Lihat dokumentasi Python argparse
untuk lebih tentang penggunaan add_argument
.
Dalam tambahan untuk dapat menambahkan penyesuaian pilihan baris perintah, semua management commands dapat menerima beberapa pilihan awal seperti --verbosity
dan --traceback
.
Pengelolaan perintah dan lokal¶
Secara awal, cara BaseCommand.execute()
menonaktifkan terjemahan karena beberapa perintah dikemas dengan Django melakukan beberapa tugas (sebagai contoh, membangun isi pengguna muka dan mengumpulkan basisdata) yang membutuhkan bahasa deretan karakter proyek-netral.
Jika, untuk beberapa alasan, penyesuaian pengelolaan perintah anda butuh menggunakan lokal yang tetap, anda harus secara manual mengaktif dan menonaktifkannya dalam cara handle()
anda menggunakan fungsi disediakan oleh dukungan kode I18N:
from django.core.management.base import BaseCommand, CommandError
from django.utils import translation
class Command(BaseCommand):
...
def handle(self, *args, **options):
# Activate a fixed locale, e.g. Russian
translation.activate('ru')
# Or you can activate the LANGUAGE_CODE # chosen in the settings:
from django.conf import settings
translation.activate(settings.LANGUAGE_CODE)
# Your command logic here
...
translation.deactivate()
Kebutuhan lainnya mungkin bahwa perintah anda dengan mudah harus menggunakan kumpulan lokal dalam pengaturan dan Django harus dijaga dari penonaktifannya. Anda dapat mencapainya dengan menggunakan pilihan BaseCommand.leave_locale_alone
.
Ketika bekerja pada skenario yang digambarkan diatas, perhatikan akun yang sistem pengelolaan perintah khususnya harus sangat waspada tentang berjalan dalam lokal yang tidak seragam, jadi anda mungkin butuh untuk:
- Pastikan pengaturan
USE_I18N
selaluTrue
ketika menjalankan perintah (ini adalah contoh bagus dari potensial masalah berasal dari sebuah lingkungan waktu berjalan dinamis dimana perintah Django menghindari begitu saja dengan menonaktifkan terjemahan). - Tinjau kode dari perintah anda dan kode dipanggil untuk perbedaan perilaku ketika lokal dirubah dan dinilai dampaknya pada perkiraan kebiasaan dari perintah anda.
Pengujian¶
Informasi pada bagaimana untuk mencoba penyesuaian pengelolaan perintah dapat ditemukan dalam dokumen percobaan.
Menimpa perintah¶
Django mendaftarkan perintah siap-pakai dan kemudian mencari untuk perintah dalam INSTALLED_APPS
secara memutar. Selama pencarian, jika sebuah nama perintah menggandakan sebuah perintah sudah terdaftar, perintah baru yang ditemukan ditimpa dahulu.
Dengan kata lain, untuk menimpa sebuah perintah, perintah baru harus memiliki nama sama dan aplikasinya harus sebelum menimpa aplikasi perintah dalam INSTALLED_APPS
.
Perintah pengelolaan dari aplikasi pihak-ketiga yang telah tidak sengaja ditimpa dapat dibuat tersedia dibawah sebuah nama baru dengan membuat perintah baru di satu dari aplikasi proyek anda (diurutkan sebelum aplikasi pihak-ketiga dalam INSTALLED_APPS
) yang mengimpor Command
dari perintah ditimpa.
Obyek perintah¶
Kelas dasar dari mana semua pengelolaan perintah akhirnya berasal.
Gunakan kelas ini jika anda ingin mengakses semua mekanisme yang mengurai argumen baris perintah dan bekerja kode apa untuk dipanggil dalam tanggapan; jika anda tidak butuh merubah kebiasaan apapun, pertimbangkan menggunakan satu dari subclasses nya.
Mensubkelaskan kelas BaseCommand
membutuhkan bahwa anda menerapkan cara handle()
.
Atribut¶
Semua atribut dapat di setel dalam kelas turunan anda dan dapat digunakan dalam subclasses BaseCommand
.
-
BaseCommand.
help
¶ Deskripsi singkat dari perintah, dimana akan ditampilkan di pesan bantuan ketika pengguna eksekusi perintah
python manage.py help <command>
.
-
BaseCommand.
missing_args_message
¶ Jika perintah anda menentukan argumen penempatan wajib, anda dapat menyesuaikan pesan kesalahan yang dikembalikan dalam kasus argumen yang hilang. Awalnya adalah keluaran oleh
argparse
("terlalu sedikit argumen").
-
BaseCommand.
output_transaction
¶ Sebuah boolean menunjukkan apakah perintah keluaran pernyataan SQL; jika
True
, keluaran akan otomatis dibungkus denganBEGIN;
danCOMMIT;
. Nilai awal adalahFalse
.
-
BaseCommand.
requires_migrations_checks
¶ Sebuah boolean; jika
True
, memerintahkan mencetak sebuah peringatan jika pengaturan perpindahan pada cakram tidak cocok dengan perpindahan di basisdata. Sebuah peringatan tidak mencegah perintah dari penjalanan. Nilai awal adalahFalse
.
-
BaseCommand.
requires_system_checks
¶ Sebuah boolean; jika
True
, seluruh proyek Django akan diperiksa untuk masalah potensial sebelum menjalankan perintah. Nilai awal adalahTrue
.
-
BaseCommand.
leave_locale_alone
¶ Sebuah boolean menunjukkan apakah kumpulan lokal dalam pengaturan harus disediakan selama penjalanan dari perintah daripada terjemahan dinonaktifkan.
Nilai awal adalah
False
.Pastikan anda mengetahui apa anda sedang kerjakan jika anda memutuskan merubah nilai dari pilihan ini dalam perintah penyesuaian anda jika itu membuat isi basisdata yang peka-lokal dan konten itu tidak mengandung terjemahan apapun (seeprti itu terjadi sebagai contoh dengan perizinan
django.contrib.auth
) ketika mengaktifkan lokal apapin mungkin menyebabkan efek-efek tidak disengaja. Lihat bagian Management commands and locales diatas untuk rincian lebih lanjut.
-
BaseCommand.
style
¶ Sebuah atribut instance yang membantu membuat keluaran bewarna ketika menulis ke
stdout
ataustderr
. Sebagai contoh:self.stdout.write(self.style.SUCCESS('...'))
Lihat Syntax coloring untuk mempelajari bagaimana merubah papan warna dan melihat gaya tersedia (gunakan versi huruf besar dari "roles" yang digambarkan dalam bagian itu).
Jika anda melewati pilihan
--no-color
ketika menjalankan perintah anda, semua pemanggilanself.style()
akan mengembalikan deretan karakter asli tidak bewarna.
Cara¶
BaseCommand
mempunyai beberapa cara yang dapat dikesampingkan tetapi hanya cara handle()
harus diterapkan.
Menerapkan constructor dalam subkelas
Jika anda menerapkan __init__
dalam subkelas anda dari BaseCommand
, anda harus memanggil __init__
dari :class:`BaseCommand:
class Command(BaseCommand):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# ...
-
BaseCommand.
add_arguments
(parser)[sumber]¶ Titik masukan untuk menambahkan pengurai argumen untuk menangani argumen baris perintah dilewati ke perintah. Penyesuaian perintah harus menimpa metode ini untuk menambah kedua argumen penempatan dan pilihan yang diterima oleh perintah. Memanggil
super()
tidak dibutuhkan ketika pengsubkelasan secara langsungBaseCommand
.
-
BaseCommand.
get_version
()[sumber]¶ Mengembalikan versi Django, yang seharusnya benar untuk semua perintah Django siap pakai. Perintah pasokan-pengguna dapat menimpa metode ini untuk mengembalikan versi mereka sendiri.
-
BaseCommand.
execute
(*args, **options)[sumber]¶ Coba untuk menjalankan perintah ini, melakukan pemeriksaan sistem jika dibutuhkan (sebagai pengendalian oleh
requires_system_checks
attribute). Jika perintah muncul sebuahCommandError
, Dia dicegat dan dicetak ke stderr.
Memanggil perintah pengelolaan di kode anda
execute()
jangan dipanggil secara langsung dari kode anda untuk menjalankan sebuah perintah. Lebih baik gunakan call_command()
.
-
BaseCommand.
handle
(*args, **options)[sumber]¶ Logika sebenarnya dari perintah. Subkelas harus menerapkan cara ini.
Itu mungkin mengembalikan sebuah string yang akan dicetak pada
stdout
(dibungkus olehBEGIN;
danCOMMIT;
jikaoutput_transaction
adalahTrue
).
-
BaseCommand.
check
(app_configs=None, tags=None, display_num_errors=False)[sumber]¶ Gunakan kerangka sistem pemeriksaan untuk memeriksa keseluruhan proyek Django untuk masalah potensial. Masalah serius muncul seperti sebuah
CommandError
; peringatan dikeluarkan ke stderr; pemberitahuan kecil dikeluarkan pada stdout.Jika
app_configs
dantags
keduanyaNone
, semua pemeriksaan sistem dilakukan.tags
dapat menjadi daftar dari etiket pemeriksaan, seperticompatibility
ataumodels
.
Subkelas BaseCommand
¶
-
class
AppCommand
¶
Sebuah pengelolaan perintah yang mengambil satu atau lebih label aplikasi terpasang sebagai argumen, dan melakukan sesuatu dengan masing-masing dari mereka.
Daripada menerapkan handle()
, subkelas harus menerapkan handle_app_config()
, yang akan dipanggil sekali untuk setiap aplikasi.
-
AppCommand.
handle_app_config
(app_config, **options)¶ Melakukan tindakan perintah untuk
app_config
, yang akan menjadi sebuah instanceAppConfig
terhubung ke sebuah label aplikasi yang diberikan pada baris perintah.
-
class
LabelCommand
¶
Sebuah pengelolaan perintah yang mengambil satu atau lebih argumen (label) yang berubah-ubah pada baris perintah, dan melakukan sesuatu dengan masing-masing dari mereka.
Daripada menerapkan handle()
, subkelas harus menerapkan handle_label()
, yang akan dipanggil sekali untuk setiap label.
-
LabelCommand.
label
¶ Sebuah string menggambarkan argumenberubah-ubah dilewatkan ke perintah. String digunakan dalam penggunaan teks dan pesan kesalahan dari perintah. Awalan pada
'label'
.
-
LabelCommand.
handle_label
(label, **options)¶ Melakukan tindakan perintah untuk
label
, yang akan menjadi deretan karakter seperti yang diberikan pada baris perintah.
Perintah pengecualian¶
Kelas pengecualian mengindikasikan sebuah masalah selama menjalankan perintah pengelolaan.
Jika pengecualian ini muncul selama peerjalanan dari pengelolaan perintah dari sebuah perintah baris tempat tuts, dia akan ditangkap dan dirubah menjadi pesan kesalahan tercetak yang bagus ke aliran keluaran yang sesuai (yaitu, stderr); sebagai sebuah hasil, memunculkan pengecualian ini (dengan sebuah gambaran yang mudah dimengerti dari kesalahan) adalah jalan yang dipilih untuk menunjukkan bahwa sesuatu telah salah dalam menjalankan sebuah perintah.
Jika sebuah pengelolaan perintah dipanggil dari kode melalui call_command()
, itu terserah kamu untuk menangkap pengecualian ketika dibutuhkan.