• 23 Июн
  • 2015
Кастомные команды manage.py или волшебство из коробки

Возможности manage.py и его команд достаточно широки. И наверняка все замечали, что сторонние (не Джанго) приложения, например South, умеют добавлять свой функционал к файлу управления проектом фреймворка Django. Давайте разберемся, как создать подобное "волшебство" в своем приложении.

Структура файлов

Прежде всего нам нужно создать несколько директорий и файлов. Пускай наше приложение называется main, именно в его директории мы будем создавать следующую структуру:

    
main/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            _private.py
            import.py
    views.py

То есть мы создали директорию management и в ней директорию commands. Затем кладем в обе директории пустые фалы __init__.py, которые сообщат Джанге, что это не просто директории, а составляющие нашего приложения.

Все файлы внутри директории commands, которые не начинаются с нижнего подчеркивания, будут выполняться при запросе с одноименной командой. То есть, если внутри будет лежать файл import.py, то по команде


./manage.py import

выполнится код, из файла.

Содержание файла

Давайте теперь добавим следующий код в файл import.py


from django.core.management.base import BaseCommand, CommandError
from main.models import *


class Command(BaseCommand):
    args = '<url>'
    help = 'Import data'

    def handle(self, *args, **options):
        try:
            url = args[0]
        except:
            raise CommandError('Needs URL for import')
// importing here self.stdout.write(url)

Как можно понять из кода, мы создаем класс Command, который содержит все необходимые данные для удачного выполнения нашей кастомной команды. args - описание синтаксиса команды, help - текст описывающий действие этой команды. Оба параметра мы будем видеть, если выполним команду:

./manage.py import --help

Метод hendle, собственно тот метод, который будет выполняться. Параметр args метода hendle содержит список переданных команде параметров, options - словарь переданных именованных параметров.

Обратите внимание, что вывод в консоль в данном случае происходит через встроенный метод класса self.stdout.write.

comments powered by Disqus