【问题标题】:Django Management Command argument obtained from execution of another program从执行另一个程序获得的 Django 管理命令参数
【发布时间】:2019-06-27 16:44:01
【问题描述】:

我需要运行管理/命令目录中包含的自定义 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 并连续将其结果作为我的自定义 Django 管理命令python manage.py populate_db 的参数的单行命令。

有可能形成这样的命令吗?如果没有,如何实现这个想法?

【问题讨论】:

标签: python django django-management-command


【解决方案1】:

如果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

您可以使用以下任一方式执行该命令:

从标准输入中获取字典

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

通过参数传递字典

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

注意:如果字典来自不受信任的来源,请注意literal_eval,因为有人可能会利用它(例如具有非常大的值)来破坏 python 解释器。

【讨论】:

  • 我已经用 python 3.7 完成了代码。如果您使用的是python f-string 替换为.format
  • @aspiring 您发布的错误表明您的属性是必需的。您是否将nargs='?', 添加到parser.add_argument,就像我的答案中的代码一样?您是否正在处理参数的缺失并从标准输入获取它?如果您可以发布populate_db.py的当前代码,它可能会有所帮助。
【解决方案2】:

将formDict的逻辑包装在一个函数中。在populate_db.py的handle函数中调用它来访问form_dict返回的结果。

将 formDict.py 移动到 management/commands/ 并使用 formDict 中的 call_command 来调用 populate_db。 https://docs.djangoproject.com/en/2.1/ref/django-admin/#running-management-commands-from-your-code.

【讨论】:

    猜你喜欢
    • 2013-01-27
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    相关资源
    最近更新 更多