Программы
Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Для того, чтобы добавить команду в Django проект надо его определить в одном из подключённых проектов. Для этого в одном из создадим подмодуль management/commands и определить там модуль с командой. Например, мы хотим создать команду для генерации текста для предпросмотра заметки (приложение post):

post
└───management
    │   __init__.py
    │
    └───commands
            gen_preview.py
            __init__.py

Файлы __init__.py оставляем пустыми, а в gen_preview.py описываем команду:

from django.core.management.base import BaseCommand
from post.models import Post


class Command(BaseCommand):
    help = 'Генерирует preview-текст из текста заметки'

    def add_arguments(self, parser):
        parser.add_argument('ids', nargs='?', type=int)
        parser.add_argument(
            '--dry-run',
            action='store_true',
            help='Просто показать те заметки, что могут быть модифицированными',
        )


    def handle(self, *args, **options):
        if options['ids']:
            posts = Post.objects.filter(id__in=options['ids'], preview='')
        else:
            posts = Post.objects.all()

        for post in posts:
            if not options['dry_run']:
                post.preview = ' '.join(post.text.split()[:10])
                post.save()

            self.stdout.write(self.style.SUCCESS(f'Successfully generated for "{post}"'))

        self.stdout.write(self.style.SUCCESS('All done'))

В классе команды мы определяем help для указания общего описания команды.

Для определения аргументов создаём метод add_arguments. Если же нашей команде не нужны параметры вызова - можно и не писать этот метод. Сам синтаксис определения параметров схож с argparse, так что можно довольно гибко и понятно описать почти всё необходимое.

Сам же обработчик пишется в методе handle. Ключи и аргументы вызова команды прилетают в виде именованных параметров метода. Далее же всё как в обычной функции - пишите код обработчика, как вам будет угодно.

Для вывода же информации в Django команде стоит использовать self.stdout.write, ведь это будет не только информативно, но и красиво!

Если интересно, что дальше - читайте рубрику Django.

Также может быть вам интересно:

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система прав доступа для пользователей - давайте её рассмотрим!

Читать »

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если одни и те же данные нужны в разных местах, лучше сделать свой контекст-процессор.

Читать »
Фото Python: Встроенные типы данных (list, set, dict, etc)

Python: Встроенные типы данных (list, set, dict, etc)

В Python есть множество встроенных типов данных. Их использование значительно упрощает жизнь и ускоряет разработку программных продуктов.

Фото Python: типы данных, переменные, логическое ветвление и циклы

Python: типы данных, переменные, логическое ветвление и циклы

Первая часть заметок о Python. О базовых типах, переменных, ветвлении и циклах.

Фото Как сделать свою middleware в Django (с примерами)

Как сделать свою middleware в Django (с примерами)

Middleware или "промежуточное программное обеспечение" - элегантный способ установить общие правила обработки запросов и ответов приложения. Давайте напишем парочку middleware, чтобы понять, как они работают.

Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Новый синтаксис старой команды with в Python 3.10

Новый синтаксис старой команды with в Python 3.10

Как же долго моё чувство прекрасного страдало… Но в Python 3.10 появился новый парсер синтаксических конструкций Python!

Фото Добавляем постраничную пагинацию на Django сайт

Добавляем постраничную пагинацию на Django сайт

На сайтах часто встречаются многостраничные объекты: список товаров, список заметок и т.д. Поэтому важно уметь добавить навигацию по страницам на Django-проекте.

Фото Новый оператор match-case в Python

Новый оператор match-case в Python

В новой версии Python (3.10) появится новый оператор. Новый оператор сопоставления по шаблону (match-case).

Фото Нет слов, одни... однострочники

Нет слов, одни... однострочники

На днях вышел пост со списком полезных однострочников для JavaScript программистов. Памятуя Perl-овую молодость, заглянул туда.