在 Django 管理命令的开头和结尾记录一些内容

Log something at beginning & end of Django management commands

现在我的 Django 项目中有多个管理命令。

我想在命令的开头和结尾记录类似 [command_name] command started[command_name] command finished 的内容,我不会在每个命令中重复自己。

已经在 handle() 方法之上尝试了装饰器,但认为这不是一个好的解决方案,因为我必须在所有命令中装饰 handle() 方法。

PS:我正在使用 python 记录器。

编辑

走到这一步:

class Parent(BaseCommand):

    def __init__(self, *args, **kwargs):
        logger.info(f'started {self.__module__}')
        super().__init__(*args, **kwargs)
        logger.info(f'finished {self.__module__}')

输出:

> started command_name
> finished command_name
> actual command logs

编写一个基础 class,您的所有命令都应继承该基础并在其中进行日志记录。作为记录输出的一个好地方是覆盖命令的 execute 方法(您的代码以错误的顺序记录,因为该命令实际上不是 __init__ 方法的 运行,它是实际上使用 class 的 run_from_argv 方法单独调用 class):

from django.core.management.base import BaseCommand as DjangoBaseCommand

class BaseCommand(DjangoBaseCommand):
    def execute(self, *args, **options):
        logger.info(f'started {self.__module__}')
        output = super().execute(*args, **options)
        logger.info(f'finished {self.__module__}')
        return output

现在,您的所有命令都继承自此命令:

from some_app.somewhere import BaseCommand


class MyCommand(BaseCommand):
    # Your code here