Аргумент команды управления Django, полученный при выполнении другой программы - PullRequest
0 голосов
/ 04 февраля 2019

Мне нужно выполнить пользовательскую команду управления Django (модуль с именем populate_db.py), включенную в каталог управления / команд.Он заполняет базу данных.

restaurant/
    __init__.py
    models.py
    management/
        commands/
            _private.py
            populate_db.py
    tests.py
    views.py
    formDict.py

Я хочу, чтобы команда приняла обязательный аргумент в качестве словаря.Упомянутый словарь может быть получен при выполнении другой программы с именем formDict.py

. Поэтому я хочу однострочную команду, которая будет запускать formDict.py и последовательно принимать ее результат в качестве аргумента для моей пользовательской команды управления Djangopython manage.py populate_db.

Можно ли вообще сформировать такую ​​команду?Если нет, то как реализовать идею альтернативно?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Если fromDict.py печатает на терминал (STDOUT), вы можете использовать pipe (|) для получения параметра из STDIN в вашей команде управления, вы можете использоватьsys.stdin за это.Поскольку вы, возможно, захотите выполнить команду самостоятельно, рекомендуется также принимать строку по параметру.

Ваша команда управления будет выглядеть так:

# populate_db.py
import argparse
import ast
import sys

from django.core.management.base import BaseCommand, CommandError


class Command(BaseCommand):
    help = 'Polulate the Database'

    def add_arguments(self, parser):
        parser.add_argument(
            'input_dict',
            nargs='?',
            type=str,
            default=None
        )

    def handle(self, *args, **options):
        if options['input_dict']:
            input_dict = options['input_dict']
        else:
            input_dict = sys.stdin.read()

        try:
            data = ast.literal_eval(input_dict)
        except SyntaxError:
            raise CommandError(f'Invalid dict input: {input_dict}')

        # populate the DB with data

Вы можете выполнить этокоманда с:

Получение диктата из STDIN

python fromDict.py | python yourproject/manage.py populate_db

или

Передача дикта по параметру

python yourproject/manage.py populate_db '{'some': 'dict'}'

Примечание: Будьте осторожны с literal_eval если dict исходит из ненадежного источника, так как кто-то может использовать его (например, с очень большими значениями), чтобы сломать интерпретатор python.

0 голосов
/ 04 февраля 2019

Оберните логику formDict в функции.Вызовите его из функции handle файла populate_db.py, чтобы получить доступ к результату, возвращенному из form_dict.

или

, переместите formDict.py в management / commands / и используйте call_command внутри formDict для вызова populate_db.https://docs.djangoproject.com/en/2.1/ref/django-admin/#running-management-commands-from-your-code.

...