Блог
  • Начало
  • Обо мне
  • Обратная связь

Django: создание собственных команд управления (вызываемых из консоли)

Дата и время: 25 декабря 2015 г. 20:23 | Категория: Django

Django предоставляет пользователям такую отличную возможность, как создание собственных консольных команд для управления проектом (вызываются они через manage.py: python manage.py имя_команды параметры).

Рассмотрим простейший пример команды для генерации объектов какой-либо модели для тестирования веб-приложения. Наличие возможности реализации собственных команд управления в django очень кстати, т.к. создавать каждый раз объектов вручную - занятие утомительное.

Предположим, что у нас есть постейшая модель тега, содержащая только текстовое поле:

# models.py
from django.db import models

class Tag(models.Model):
    text = models.CharField(max_length=32)

Реализуем команду createtags для генерирования определённого количества тегов.

1. В папке с вашим приложением (там же где по умолчанию находится файл models.py) создадим поддиректорию management, а в ней, в свою очередь, поддиректорию commands. В случае, если вы используете Python 2, то не забудьте поместить __init__.py в созданные папки.

2. В папке commands создадим файл исходного кода Python с именем, совпадающим с желаемым именем команды, то есть createtags.py.

3. Создадим необходимый класс команды, наследованный от класса BaseCommand, который предоставляется фреймворком:

from django.core.management.base import BaseCommand
from main_app import models


class Command(BaseCommand):
    # Задаём текст помощи, который будет
    # отображён при выполнении команды
    # python manage.py createtags --help
    help = 'Creates specified number of tags'

    def add_arguments(self, parser):
        # Указываем сколько и каких аргументов принимает команда.
        # В данном случае, это один аргумент типа int.
        parser.add_argument('tags_count', nargs=1, type=int)

    def handle(self, *args, **options):
        # Получаем аргумент, создаём необходимое количество тегов
        # и выводим сообщение об успешном завершении генерирования
        tags_count = options['tags_count'][0]

        for i in range(tags_count):
            models.Tag.objects.create(text='Tag{0}'.format(i))

        self.stdout.write('Successfully created {0} tags!'.format(tags_count))

Теперь, для создания 100 тегов, можно вызвать команду следующим образом: python manage.py createtags 100. При этом, фреймворк сам выполнит валидацию количества и типа аргументов, а в случае необходимости выведет сообщение об ошибке.

Для представления дополнительных возможностей при работе с командами, предлагаю рассмотреть ещё один, достаточно отдалённый от жизни пример:

# showfeatures.py
from django.core.management.base import BaseCommand, CommandError


class Command(BaseCommand):
    def add_arguments(self, parser):
        # Команда может принимать переменное число аргументов,
        # причём при указании '+', должен быть предоставлен
        # хотя бы один агрумент данного типа, а при указании
        #  '*' может быть не предоставлено ни одного
        parser.add_argument('strings', nargs='*', type=str)

    def handle(self, *args, **options):
        # Аргументы приходят в списке
        for string in options['strings']:
            self.stdout.write(string)

        # Для команды существует свой класс ошибки
        if len(options['strings']) == 0:
            raise CommandError('No strings!')

При запуске данной команды следующим образом: python manage.py showfeatures, получим ошибку
CommandError: No strings!.

Запустив с параметрами: python manage.py showfeatures one two, получим в ответ:

one
two

В заключение могу сказать, что не следует лениться писать свои команды. Они могут значительно упростить вам жизнь.

comments powered by Disqus
Select language:
  • Русский
  • English

  • Программирование

    Python C++ JavaScript

    Веб-разработка

    Django ASP.NET

    Мобильная разработка

    Windows Phone Android

    Разработка игр

    Unity3d Blender

    Артем Устимов © 2014