在 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
现在我的 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