[PYTHON] Créez des commandes Django personnalisées et exécutez-les à partir de la ligne de commande

Créez des commandes Django personnalisées pour effectuer le traitement à partir de la ligne de commande

introduction

Lors du développement d'une application Web, vous souhaiterez peut-être effectuer un traitement spécifique (traitement d'agrégation, appel API, remise de courrier, etc.) à partir de la ligne de commande. Cet article vous montrera comment écrire un processus pour exécuter une application Django à partir de la ligne de commande.

Outils de ligne de commande Django

Par défaut, Django est livré avec des outils de ligne de commande qui vous permettent de faire des choses comme ce qui suit à partir de la ligne de commande:

python manage.py startapp sample =>Créer une application
python manage.py migrate         =>Exécution de la migration de base de données
python manage.py shell           =>Lancez Interactive Shell
python manage.py runserver       =>Démarrer le serveur de développement

Il existe de nombreuses autres commandes disponibles, et vous pouvez taper python manage.py pour voir une liste des commandes disponibles.

% python manage.py      

Type 'manage.py help <subcommand>' for help on a specific subcommand.

Available subcommands:

[auth]
    changepassword
    createsuperuser

[debug_toolbar]
    debugsqlshell

[django]
    check
    compilemessages
    createcachetable
    dbshell
    diffsettings
    dumpdata
    flush
    inspectdb
    loaddata
    makemessages
    makemigrations
    migrate
    sendtestemail
    shell
    showmigrations
    sqlflush
    sqlmigrate
    sqlsequencereset
    squashmigrations
    startapp
    startproject
    test
    testserver

[sessions]
    clearsessions

[staticfiles]
    collectstatic
    findstatic
    runserver

Pour une aide plus détaillée sur une commande particulière, tapez «help» suivi du nom de la commande que vous souhaitez référencer, comme «python manage.py help runserver».

% python manage.py help runserver     
usage: manage.py runserver [-h] [--version] [-v {0,1,2,3}]
                           [--settings SETTINGS] [--pythonpath PYTHONPATH]
                           [--traceback] [--no-color] [--ipv6] [--nothreading]
                           [--noreload] [--nostatic] [--insecure]
                           [addrport]

Starts a lightweight Web server for development and also serves static files.

positional arguments:
  addrport              Optional port number, or ipaddr:port

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, e.g.
                        "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, e.g.
                        "/home/djangoprojects/myproject".
  --traceback           Raise on CommandError exceptions
  --no-color            Don't colorize the command output.
  --ipv6, -6            Tells Django to use an IPv6 address.
  --nothreading         Tells Django to NOT use threading.
  --noreload            Tells Django to NOT use the auto-reloader.
  --nostatic            Tells Django to NOT automatically serve static files
                        at STATIC_URL.
  --insecure            Allows serving static files even if DEBUG is False.

Création de commandes personnalisées pour Django

Les outils de ligne de commande de Django fournissent un mécanisme pour ajouter des commandes. Une fois que vous avez ajouté une commande personnalisée, vous pouvez l'exécuter à partir d'un outil de ligne de commande comme suit:

python manage.py <Nom de commande personnalisé>

échantillon

Cette fois, ajoutons une commande personnalisée à cette Application de gestion de blog et exécutons-la. Veuillez vérifier le contenu du Github lié pour le code source final.

La structure du répertoire de blog de l'application de gestion de blog est la suivante.

├── blog
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── migrations/
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── django_sample/
├── manage.py
└── requirements.txt

Créer un annuaire

Tout d'abord, créez un répertoire (gestion / commandes) pour stocker les commandes sous l'application de blog.

mkdir -p blog/management/commands
touch blog/management/__init__.py
touch blog/management/commands/__init__.py  

Créer une commande

Ensuite, créez count_entry.py, qui est le corps principal de la commande, dans le répertoire créé (management / commands /).

vi blog/management/commands/count_entry.py

Les commandes personnalisées héritent de la classe BaseCommand pour créer une classe. Le corps de traitement réel est décrit dans la méthode «handle». Cette fois, nous allons créer un programme qui affiche le nombre d'articles de blog passés en argument.

count_entry.py


# -*- coding:utf-8 -*-


from django.core.management.base import BaseCommand

from ...models import Article


#Créé en héritant de BaseCommand
class Command(BaseCommand):
    # python manage.py help count_Message affiché par entrée
    help = 'Display the number of blog articles'

    #Spécifiez les arguments de ligne de commande.(module argparse https://docs.python.org/2.7/library/argparse.html)
    #Cette fois, le blog_Obtenez-le avec l'identifiant du nom. (Au moins un argument,type int)
    def add_arguments(self, parser):
        parser.add_argument('blog_id', nargs='+', type=int)

    #La méthode appelée lorsque la commande est exécutée
    def handle(self, *args, **options):
        for blog_id in options['blog_id']:
            articles_count = Article.objects.filter(blog_id=blog_id).count()

            self.stdout.write(self.style.SUCCESS('Article count = "%s"' % articles_count))

La structure finale des répertoires est la suivante.

blog
├── __init__.py
├── admin.py
├── apps.py
├── forms.py
├── management =>Répertoire de stockage des commandes personnalisées
│   ├── __init__.py
│   └── commands
│       ├── __init__.py
│       └── count_entry.py
├── migrations/
├── models.py
├── tests.py
├── urls.py
└── views.py

Exécution de commandes personnalisées

Exécutons la commande personnalisée créée. Tout d'abord, lancez python manage.py pour voir si des commandes personnalisées ont été ajoutées.

% python manage.py 

Type 'manage.py help <subcommand>' for help on a specific subcommand.

Available subcommands:

[auth]
    changepassword
    createsuperuser

[blog]
    count_entry =>A été ajouté

[debug_toolbar]
    debugsqlshell

[django]
    check
    compilemessages
    createcachetable
    dbshell
    diffsettings
    dumpdata
    flush
    inspectdb
    loaddata
    makemessages
    makemigrations
    migrate
    sendtestemail
    shell
    showmigrations
    sqlflush
    sqlmigrate
    sqlsequencereset
    squashmigrations
    startapp
    startproject
    test
    testserver

[sessions]
    clearsessions

[staticfiles]
    collectstatic
    findstatic
    runserver

La commande count_entry a été ajoutée. Tapez ensuite python manage.py count_entry 1 pour exécuter la commande personnalisée que vous avez créée.

% python manage.py count_entry 1
Article count = "2"

Une commande personnalisée a été exécutée et le nombre d'articles sur le blog a été affiché. Vous pouvez également utiliser la commande help comme vous le feriez avec une commande Django classique. La commande créée peut être exécutée régulièrement en utilisant cron etc. comme un script normal.

À la fin

Cette fois, j'ai présenté comment créer une commande personnalisée qui peut être exécutée à partir de l'outil de ligne de commande de Django. Je pense qu'il existe de nombreux cas où vous créez vos propres commandes, par exemple lorsque vous souhaitez exécuter un traitement régulièrement avec cron. Pourquoi ne pas créer une commande personnalisée pour Django et l'utiliser? Ayez une vie Django amusante!

Site de référence

Recommended Posts

Créez des commandes Django personnalisées et exécutez-les à partir de la ligne de commande
Comment créer un article à partir de la ligne de commande
Plongez dans la commande Django Custom [1]
[EC2] Comment installer et télécharger chromedriver à partir de la ligne de commande
Ouvrez la version Chrome de LINE à partir de la ligne de commande [Linux]
Remarque DJango: depuis le début (Simplification et fractionnement d'URLConf)
Rechercher des fichiers volumineux sous Linux à partir de la ligne de commande
Publier Twitter depuis la ligne de commande
Créer et lister des modèles Django
[Django] Organiser les commandes et les rôles
Installez Chrome en ligne de commande sur Sakura VPS (Ubuntu) et lancez Chrome avec python à partir de l'affichage virtuel et du sélénium
Exécutez Pylint et lisez les résultats
DJango Memo: Depuis le début (préparation)
Création d'une commande de recherche personnalisée Splunk, partie 2
Créer un bot LINE avec Django
Obtenez, testez et soumettez des cas de test dans le concours AtCoder à partir de la ligne de commande
Obtenez des options en Python à partir des fichiers JSON et des arguments de ligne de commande
Déployez Django + React à partir de zéro vers GKE (4) Créez un cluster et un conteneur PUSH
Recevez des nouvelles de chacune des trois principales entreprises de téléphonie mobile en utilisant Django et l'API News
Créez une commande pour rechercher des composés similaires dans la base de données cible avec RDKit et vérifiez le temps de traitement