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

问题描述

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

解决方法

编写一个基类,您的所有命令都应从该基类继承并在其中进行日志记录。记录输出的一个好地方是覆盖命令的 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...