编写自定义Django BaseCommand类以记录命令细节
我在我的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()
函数返回一个成功的字符串时,我才会记录成功。(可以根据你的需求进行修改)。如果它抛出异常,就会记录为失败。同样的,你可以根据自己的需要进行调整(比如记录异常的字符串)。