0

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

我想以一种我不会在每个命令中重复自己的方式在命令的开头和结尾记录类似[command_name] command startedand的内容。[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
4

1 回答 1

1

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

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
于 2021-04-06T15:27:20.470 回答