When developing a web application, you may want to perform specific processing (aggregation processing, API call, mail delivery, etc.) from the command line. This article will show you how to write a process to run a Django application from the command line.
By default, Django comes with command-line tools that allow you to do things like the following from the command line:
python manage.py startapp sample =>Creating an application
python manage.py migrate         =>Executing DB migration
python manage.py shell           =>Launching an interactive shell
python manage.py runserver       =>Start development server
There are many other commands available, and you can type python manage.py to see a list of available commands.
% 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
For more detailed help for a particular command, type help followed by the name of the command you want to reference, such as 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.
Django's command-line tools provide a mechanism for adding commands. Once you have added a custom command, you can run it from a command line tool as follows:
python manage.py <Custom command name>
This time, let's add a custom command to this Blog management application and execute it. Please check the contents of the linked Github for the final source code.
The structure of the blog directory of the blog management application is as follows.
├── blog
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── migrations/
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── django_sample/
├── manage.py
└── requirements.txt
First, create a directory (management / commands) for storing commands under the blog application.
mkdir -p blog/management/commands
touch blog/management/__init__.py
touch blog/management/commands/__init__.py  
Next, create count_entry.py, which is the main body of the command, in the created directory (management / commands /).
vi blog/management/commands/count_entry.py
Custom commands inherit from the BaseCommand class to create a class. The actual processing body is described in the handle method. This time, we will create a program that displays the number of blog articles passed as an argument.
count_entry.py
# -*- coding:utf-8 -*-
from django.core.management.base import BaseCommand
from ...models import Article
#Created by inheriting BaseCommand
class Command(BaseCommand):
    # python manage.py help count_Message displayed by entry
    help = 'Display the number of blog articles'
    #Specify command line arguments.(argparse module https://docs.python.org/2.7/library/argparse.html)
    #This time blog_Get it with the name id. (At least one argument,int type)
    def add_arguments(self, parser):
        parser.add_argument('blog_id', nargs='+', type=int)
    #Method called when the command is executed
    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))
The final directory structure is as follows.
blog
├── __init__.py
├── admin.py
├── apps.py
├── forms.py
├── management =>Directory for storing custom commands
│   ├── __init__.py
│   └── commands
│       ├── __init__.py
│       └── count_entry.py
├── migrations/
├── models.py
├── tests.py
├── urls.py
└── views.py
Let's execute the created custom command. First run python manage.py to see if any custom commands have been added.
% python manage.py 
Type 'manage.py help <subcommand>' for help on a specific subcommand.
Available subcommands:
[auth]
    changepassword
    createsuperuser
[blog]
    count_entry =>Has been added
[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
The count_entry command has been added. Then type python manage.py count_entry 1 to run the custom command you created.
% python manage.py count_entry 1
Article count = "2"
A custom command was executed and the number of blog posts was displayed. You can also use the help command as you would a regular Django command. The created command can be executed regularly by using cron etc. like a normal script.
This time, I introduced how to create a custom command that can be executed from Django's command line tools. I think there are many cases where you create your own command, such as when you want to execute processing regularly with cron. Why not create a custom Django command and take advantage of it? Have a fun Django life!
Recommended Posts