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