【问题标题】:Can Django manage.py custom commands return a value? How, or why not?Django manage.py 自定义命令可以返回值吗?如何,或者为什么不?
【发布时间】:2014-03-21 23:31:03
【问题描述】:

按照文档: https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

我创建了自己的自定义命令(称为其他命令,但示例如下所示):

from django.core.management.base import BaseCommand, CommandError
from polls.models import Poll

class Command(BaseCommand):
    args = '<poll_id poll_id ...>'
    help = 'Closes the specified poll for voting'

    def handle(self, *args, **options):
        for poll_id in args:
            try:
                poll = Poll.objects.get(pk=int(poll_id))
            except Poll.DoesNotExist:
                raise CommandError('Poll "%s" does not exist' % poll_id)

            poll.opened = False
            poll.save()

            self.stdout.write('Successfully closed poll "%s"' % poll_id)

        return "Yay"

问题是为什么返回像“Yay”这样的字符串不起作用? 是我做错了还是不可能?

当我从视图中调用自定义命令时,我会执行以下操作:

     value = call_command('call_custom_command', parameter)
     print value

但该值显示为无。

【问题讨论】:

    标签: python django django-commands


    【解决方案1】:

    如果你想得到call_command()的输出,你需要捕获stdout。你可以这样做:

    out = StringIO()
    call_command('call_custom_command', stdout=out)
    
    value = out.getvalue()
    print value
    

    这种技术实际上是在django tests 中用于测试管理命令。

    演示:

    >>> from django.core.management import call_command
    >>> from StringIO import StringIO
    >>> out = StringIO()
    >>> call_command('validate', stdout=out)
    >>> out.getvalue()
    '0 errors found\n'
    

    希望对您有所帮助。

    【讨论】:

    • 是的,它完全有效。标准输出将同时获得您的 self.stdout.write('values') 和您的返回值;所以,我解析了整个 out.getvalue() 并且一切正常。谢谢!
    • # for python3 use ->> from io import StringIO
    • 如果您 return 来自管理命令的某些内容,则此方法有效。如果你只是打印,它不会工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2013-10-05
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    相关资源
    最近更新 更多