编写自定义Django BaseCommand类以记录命令细节

1 投票
1 回答
1023 浏览
提问于 2025-04-17 12:22

我在我的Django应用中有一些管理命令。我希望每次运行管理命令时,都能在我的一个模型中记录一条记录。这个模型包含四个字段:

  • started - 命令开始的时间。
  • ended - 命令结束或停止的时间。
  • success - 一个布尔值,表示命令是否成功运行。
  • name - 命令的名称。

我认为实现这个功能的最好方法是写一个自定义类,叫做 LoggedBaseCommand,它继承自 django.core.management.base.BaseCommand。我的管理命令将从这个类继承,这样就可以包含简单的记录功能。

我知道一些实现的细节,但就是不知道怎么把这些拼凑在一起。

有没有人能帮帮我?

谢谢

1 个回答

2
from commandlog.models import CommandLogEntry
class LoggedBaseCommand(Command):

    def handle(self, *args, **options):
        # 'started' ought to be automatic, 'ended' and 'success' not yet determined.
        c = CommandLogEntry(name = __file__)
        result = "FAIL"
        try:
            result = self.handle_and_log(*args, **options)
        except: 
            pass
        c.success = result
        c.ended = datetime.datetime.now()
        c.save()

    def handle_and_log(self, *args, **options):
        # All of your child classes use this.

你可能需要调整一下 __file__ 这个条目,可能要用到 re 这个模块,来去掉路径和结尾的 '.py'。因为每个命令都是基于它在文件层级中的名字,所以这样做应该可以解决问题。需要注意的是,我假设默认是失败的,只有当 handle_and_log() 函数返回一个成功的字符串时,我才会记录成功。(可以根据你的需求进行修改)。如果它抛出异常,就会记录为失败。同样的,你可以根据自己的需要进行调整(比如记录异常的字符串)。

撰写回答