Membuat perintah manajemen di Django

Perintah manajemen - perintah yang dijalankan dari baris perintah menggunakan script manage.py.

Area aplikasi yang paling umum adalah tindakan yang dilakukan sekali atau secara berkala, tetapi untuk itu peluncuran melalui penjadwal adalah karena alasan tertentu tidak tersedia. Misalnya, mengirim pesan satu kali kepada pengguna, mengambil data dari database, memeriksa keberadaan file dan folder yang diperlukan sebelum meluncurkan pembaruan, dengan cepat membuat objek model selama pengembangan, dll.

Dasar-dasarnya


Perintah dibuat di direktori aplikasi (aplikasi harus ditambahkan ke INSTALED_APPS), di subdirektori aplikasi / manajemen / perintah. File terpisah dibuat untuk setiap perintah. File akan tersedia dari baris perintah, kecuali untuk yang dimulai dengan garis bawah.

app/ __init__.py management/ __init__.py commands/ __init__.py _tools.py zen.py 

Dalam contoh ini, perintah zen akan tersedia, tetapi _tools tidak.

Perintah dibuat dengan mewarisi dari kelas django.core.management.base.BaseCommand. Dalam kasus paling sederhana, cukup menulis ulang fungsi pegangan. Perintah ini akan dieksekusi, dan hasilnya dikembalikan akan dicetak di konsol.

 from django.core.management.base import BaseCommand class Command(BaseCommand): help = 'The Zen of Python' def handle(self, *args, **options): import this 

Mari kita coba panggil perintah kita:

 python manage.py zen The Zen of Python, by Tim Peters Beautiful is better than ugly. ... 

Atribut kelas bantuan adalah deskripsi yang ditampilkan ketika perintah dengan sakelar --help dipanggil atau jika perintah yang dimasukkan salah.

 $ python manage.py zen --help usage: manage.py zen [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS] [--pythonpath PYTHONPATH] [--traceback] [--no-color] The Zen of Python optional arguments: -h, --help show this help message and exit --version show program's version number and exit -v {0,1,2,3}, --verbosity {0,1,2,3} Verbosity level; 0=minimal output, 1=normal output, 2=verbose output, 3=very verbose output --settings SETTINGS The Python path to a settings module, eg "myproject.settings.main". If this isn't provided, the DJANGO_SETTINGS_MODULE environment variable will be used. --pythonpath PYTHONPATH A directory to add to the Python path, eg "/home/djangoprojects/myproject". --traceback Raise on CommandError exceptions --no-color Don't colorize the command output. 

Argumen Parsing


Seperti yang bisa kita lihat, tim kami sudah mengambil 7 argumen.

Tetapi bagaimana jika ini tidak cukup bagi kami dan kami ingin menambahkan opsi kami sendiri? Untuk melakukan ini, Anda perlu membuat fungsi add_arguments di kelas kami, tempat mendaftar semua argumen yang ingin kami sampaikan ke tim kami. Setiap argumen dibuat dengan memanggil fungsi parser.add_argument dengan serangkaian parameter.

Misalkan kita tidak nyaman dengan keluaran panjang dari fungsi kita, dan kita hanya ingin Hello world dicetak dengan tombol -s dan --short:

 from django.core.management.base import BaseCommand class Command(BaseCommand): help = 'The Zen of Python' def handle(self, *args, **options): if options['short']: import __hello__ else: import this def add_arguments(self, parser): parser.add_argument( '-s', '--short', action='store_true', default=False, help='  ' ) 

File ini akan mencetak Hello world saat dipanggil dengan tombol -s.

 $ python manage.py zen -s Hello world... (coolwriter)$ python manage.py zen The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. ... 

Mari kita teliti lebih detail bagaimana parsing argumen ditentukan.

Parser diwarisi dari argparse.ArgumentParser, dan Anda dapat membaca tentang argumen yang diambil oleh fungsi add_argument dalam dokumentasi untuk perpustakaan argparse dalam dokumentasi python. Yang paling penting adalah:

nama atau bendera - nama atau daftar nama dan label. Kami memiliki ini 'pendek', '-s' dan '--pendek'.
aksi - apa yang harus dilakukan dengan nilai argumen. Opsi yang paling menarik (tetapi tidak semua) adalah sebagai berikut:

store - simpan sebagai nilai opsi kami. Jika beberapa pasangan kunci-nilai ditransmisikan, nilai yang terakhir
store_const - menyimpan nilai konstan dalam kunci nama. Konstanta dilewatkan sebagai argumen const ke fungsi add_argument yang sama.

Sebagai contoh:

 parser.add_argument('my_option', action='store_const', const=1234) 

Fungsi pegangan dalam opsi akan diteruskan 'my_option': 1234

store_true, store_false - kasus khusus dari opsi sebelumnya. Benar atau Salah disimpan
append - nilai akan ditambahkan ke akhir daftar
append_const sama dengan yang sebelumnya, tetapi nilai yang dilewatkan ke argumen const menambahkan (yang bisa berupa objek apa saja)

nargs adalah jumlah argumen. Nilai yang mungkin: integer, '?' - satu atau nilai default dari argumen default, '*' - sebanyak yang ada, dan dikumpulkan dalam daftar, '+' - setidaknya satu, dan jika beberapa - dikumpulkan dalam daftar, argparse.REMAINDER - semua argumen yang tersisa dari baris perintah dikumpulkan di sana . Tidak kompatibel dengan action = const

Harap dicatat: jika Anda menggunakan argumen ini, nilai opsi Anda dari baris perintah akan diteruskan untuk ditangani sebagai daftar, bahkan jika hanya ada satu elemen. (Dalam hal ini, nilai default ditransmisikan apa adanya, tanpa casting ke daftar.)

default adalah nilai default .
type - melemparkan argumen ke tipe yang ditentukan.
pilihan - pembatasan varian dari nilai argumen. Daftar nilai yang mungkin diteruskan ke nilai pilihan.
diperlukan adalah argumen wajib.
help - Deskripsi tentang apa yang dilakukan argumen ini.
dest - jika Anda ingin menyimpan opsi Anda dengan nama yang berbeda, Anda dapat menentukan dest = 'my_new_name'. Kalau tidak, nama argumen akan digunakan.
Argumen ini kemudian akan diteruskan ke fungsi pegangan sebagai kamus opsi.

Tetapi bagaimana jika kita ingin memberikan argumen yang tidak disebutkan namanya untuk ditangani?

Dalam hal ini, Anda perlu menentukan dalam add_arguments tanda terima dari semua argumen yang tidak disebutkan namanya dalam opsi args. Sebagai contoh, jika kita ingin mengirimkan beberapa bilangan bulat ke perintah:

 def add_arguments(self, parser): parser.add_argument( nargs='+', type=int, dest = 'args' ) 

Perintah eksekusi


Perintah dijalankan dalam urutan berikut:

  1. Pertama, metode run_from_argv () dipanggil. Metode ini membuat parser melalui panggilan ke create_parser, dan parser yang dibuat menambahkan argumen default (dari tipe no-color), dan juga memanggil metode add_arguments, sehingga menambahkan semua opsi yang kami buat.
  2. Setelah itu, fungsi eksekusi dipanggil. Fungsi ini melakukan beberapa pemeriksaan, dan kemudian menjalankan fungsi pegangan. Hasil pegangan dicetak ke output standar.

Tentu saja, salah satu dari fungsi ini dapat disesuaikan. Sebagai contoh, mari kita menggambar output yang indah dari pesan bantuan multi-line:

 from argparse import RawTextHelpFormatter def create_parser(self, prog_name, subcommand): parser = super(Command, self).create_parser(prog_name, subcommand) parser.formatter_class = RawTextHelpFormatter return parser 

Mungkin itulah yang diperlukan untuk menulis perintah manajemen dalam banyak kasus.

Kesimpulan


Artikel ini tidak mengklaim sebagai gambaran lengkap dari semua kemungkinan saat membuat perintah manajemen - semuanya dijelaskan dalam dokumentasi Django. Mereka yang tertarik dapat beralih ke
dokumentasi .

Mengurai argumen baris perintah di sana, sayangnya, praktis tidak diungkapkan. Mereka yang ingin menyelami seluk-beluk masalah ini harus mempelajari kumulasi python.

Modul argparse

Source: https://habr.com/ru/post/id415049/


All Articles