【问题标题】:stop django command using sys.exit()使用 sys.exit() 停止 django 命令
【发布时间】:2016-01-14 19:09:50
【问题描述】:

嗨,我对 django 命令有疑问,如果发生某些情况,我需要停止命令,通常在 python 脚本中我使用 sys.exit() 执行此操作,因为我不希望脚本仍然在做事我在 Django 上尝试了这个,但没有用另一种方法来停止命令运行?

健康和美好的事物。

【问题讨论】:

  • 你不能简单地来自处理程序的return 吗?做sys.exit() 是不安全的。它可能会使您的应用程序处于损坏状态。应该不惜一切代价避免它。通常,您会使用sys.exit 的唯一情况是您想以特定状态码退出。但即使在这种情况下,您也只能在顶层和内部函数中 sys.exit 抛出异常。除此之外,我认为sys.exit 没有任何实际用途。
  • 还要注意,异常正是为您尝试做的事情而设计的工具。

标签: django


【解决方案1】:

来自the docs

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

class Command(BaseCommand):
    help = 'Closes the specified poll for voting'

    def add_arguments(self, parser):
        parser.add_argument('poll_id', nargs='+', type=int)

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

            poll.opened = False
            poll.save()

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

即你应该提出一个CommandError

虽然sys.exit 通常也应该可以正常工作(我的意思是,你说它不适合你 - 如果是我,我很想知道为什么不这样做)

【讨论】:

  • 感谢您的回复,我将尝试这种方法,但我只是在不危险的过程中仅在精确验证中使用它,例如文件夹中没有文件只需退出并停止整个脚本但我将尝试根据文档记住 sys.exit(),您可以轻松地使用 wit try 和 except 语句。
【解决方案2】:

我很惊讶看到这些解决方案,因为它们都不起作用。 Sys.exit() 刚刚结束当前​​线程并引发“CommandError”仅开始异常处理。提出KeyboardInterrupt 也没有任何效果。也许这些解决方案曾经适用于早期版本,或者适用于在不同上下文中启动的服务器。

我遇到的here 的一个解决方案是_thread.interrupt_main()。它在整齐地完成当前请求后停止服务器。

【讨论】:

  • 嗯,原来的帖子不是关于停止服务器(你为什么要首先这样做,这是史诗般的安全漏洞),而是停止命令。事实上,CommandError 确实做到了它所承诺的,命令以 status_code != 0 结尾
猜你喜欢
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 2020-05-07
  • 2011-12-20
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多