Erstellen von Verwaltungsbefehlen in Django

Verwaltungsbefehle - Befehle, die über die Befehlszeile mit dem Skript manage.py ausgeführt werden.

Die häufigsten Anwendungsbereiche sind Aktionen, die einmal oder regelmäßig ausgeführt werden, für die jedoch der Start über den Scheduler aus irgendeinem Grund nicht verfügbar ist. Senden Sie beispielsweise einmalige Nachrichten an Benutzer, rufen Sie Daten aus einer Datenbank ab, prüfen Sie, ob die erforderlichen Dateien und Ordner vorhanden sind, bevor Sie Aktualisierungen durchführen, erstellen Sie schnell Modellobjekte während der Entwicklung usw.

Die Grundlagen


Befehle werden in Anwendungsverzeichnissen (Anwendungen müssen zu INSTALED_APPS hinzugefügt werden) im Unterverzeichnis app / management / command erstellt. Für jeden Befehl wird eine separate Datei erstellt. Dateien sind über die Befehlszeile verfügbar, mit Ausnahme derjenigen, die mit einem Unterstrich beginnen.

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

In diesem Beispiel ist der Befehl zen verfügbar, _tools jedoch nicht.

Befehle werden durch Erben von der Klasse django.core.management.base.BaseCommand erstellt. Im einfachsten Fall reicht es aus, die Handle-Funktion neu zu schreiben. Dieser Befehl wird ausgeführt und das von ihm zurückgegebene Ergebnis wird in der Konsole gedruckt.

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

Versuchen wir, unseren Befehl aufzurufen:

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

Das Attribut der Hilfeklasse ist eine Beschreibung, die angezeigt wird, wenn ein Befehl mit der Option --help aufgerufen wird oder wenn der Befehl falsch eingegeben wird.

 $ 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. 

Argumente analysieren


Wie wir sehen können, nimmt unser Team bereits 7 Argumente vor.

Aber was ist, wenn uns dies nicht ausreicht und wir unsere eigenen Optionen hinzufügen möchten? Dazu müssen Sie die Funktion add_arguments in unserer Klasse erstellen, in der alle Argumente aufgelistet sind, die wir an unser Team übergeben möchten. Jedes Argument wird durch Aufrufen der Funktion parser.add_argument mit einer Reihe von Parametern erstellt.

Angenommen, wir sind mit der langen Ausgabe unserer Funktion nicht zufrieden und möchten, dass nur Hello world mit den Tasten -s und --short gedruckt wird:

 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='  ' ) 

Diese Datei druckt Hello world, wenn sie mit dem Schalter -s aufgerufen wird.

 $ 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. ... 

Lassen Sie uns genauer untersuchen, wie das Parsen von Argumenten spezifiziert wird.

Der Parser wird von argparse.ArgumentParser geerbt, und Sie können die Argumente der Funktion add_argument in der Dokumentation zur argparse-Bibliothek in der Python-Dokumentation nachlesen. Die wichtigsten sind:

Name oder Flaggen - Name oder Liste der Namen und Bezeichnungen. Wir haben dieses 'kurze', '-s' und '--short'.
Aktion - Was tun mit dem Wert des Arguments? Die interessantesten (aber nicht alle) Optionen sind:

speichern - als Wert unserer Option speichern . Wenn mehrere Schlüssel-Wert-Paare übertragen werden, der Wert des letzten
store_const - speichert den konstanten Wert im Namensschlüssel. Die Konstante wird als const- Argument an dieselbe Funktion add_argument übergeben.

Zum Beispiel:

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

Die Handle-Funktion in Optionen wird an 'my_option' übergeben: 1234

store_true, store_false - Sonderfälle der vorherigen Option. Richtig oder falsch gespeichert
Anhängen - Der Wert wird an das Ende der Liste angehängt
append_const ist derselbe wie der vorherige, aber der an das const- Argument übergebene Wert wird angehängt (das kann ein beliebiges Objekt sein).

nargs ist die Anzahl der Argumente. Mögliche Werte: Ganzzahl, '?' - ein oder der Standardwert aus dem Standardargument '*' - so viele wie vorhanden und in einer Liste gesammelt sind, '+' - mindestens einer, und wenn mehrere - in einer Liste gesammelt werden, argparse.REMAINDER - alle verbleibenden Argumente aus der Befehlszeile werden dort gesammelt . Inkompatibel mit action = const

Bitte beachten Sie: Wenn Sie dieses Argument verwenden, wird der Wert Ihrer Option über die Befehlszeile als Liste übergeben, auch wenn nur ein Element vorhanden ist. (In diesem Fall wird der Standardwert unverändert übertragen, ohne in die Liste umgewandelt zu werden.)

Standard ist der Standardwert .
Typ - Wandelt das Argument in den angegebenen Typ um.
Auswahlmöglichkeiten - Einschränkung der Optionen für den Wert des Arguments. Eine Liste möglicher Werte wird an den Auswahlwert übergeben.
Erforderlich ist ein erforderliches Argument.
help - Eine Beschreibung dessen, was dieses Argument bewirkt.
dest - Wenn Sie Ihre Option unter einem anderen Namen speichern möchten, können Sie dest = 'my_new_name' angeben. Andernfalls wird der Argumentname verwendet.
Diese Argumente werden dann als Optionswörterbuch an die Handle-Funktion übergeben.

Aber was ist, wenn wir unbenannte Argumente übergeben möchten?

In diesem Fall müssen Sie in add_arguments den Empfang aller unbenannten Argumente in der Option args angeben. Wenn wir beispielsweise mehrere Ganzzahlen an den Befehl übergeben möchten:

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

Ausführungsreihenfolge


Der Befehl wird in der folgenden Reihenfolge ausgeführt:

  1. Zunächst wird die Methode run_from_argv () aufgerufen. Diese Methode erstellt einen Parser durch einen Aufruf von create_parser. Der erstellte Parser fügt Standardargumente (vom Typ no-color) hinzu und ruft auch die Methode add_arguments auf, wodurch alle von uns erstellten Optionen hinzugefügt werden.
  2. Danach wird die Execute-Funktion aufgerufen. Diese Funktion führt mehrere Überprüfungen durch und führt dann die Handle-Funktion aus. Das Ergebnis des Griffs wird auf die Standardausgabe gedruckt.

Natürlich kann jede dieser Funktionen angepasst werden. Zeichnen wir zum Beispiel die schöne Ausgabe einer mehrzeiligen Hilfemeldung:

 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 

Das ist wahrscheinlich alles, was in den meisten Fällen zum Schreiben von Verwaltungsbefehlen erforderlich ist.

Fazit


Der Artikel erhebt keinen Anspruch auf einen vollständigen Überblick über alle Möglichkeiten beim Erstellen von Verwaltungsbefehlen - diese sind in der Django-Dokumentation beschrieben. Interessenten können sich an wenden
Dokumentation .

Das Parsen von Befehlszeilenargumenten wird dort leider praktisch nicht bekannt gegeben. Wer sich mit den Feinheiten dieses Themas befassen möchte, sollte sich mit der Python-Kumulation befassen.

Argparse-Modul

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


All Articles