Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在开始时记录某事&;Django管理命令结束_Python_Django_Logging_Command_Django Management Command - Fatal编程技术网

Python 在开始时记录某事&;Django管理命令结束

Python 在开始时记录某事&;Django管理命令结束,python,django,logging,command,django-management-command,Python,Django,Logging,Command,Django Management Command,现在我的Django项目中有多个管理命令 我想在命令的开始和结束处记录类似于[command\u name]command start和[command\u name]command finished的内容,这样我就不会在每个命令中重复我自己了 已经在handle()方法上尝试了decorators,但认为这不是一个好的解决方案,因为我必须在所有命令中修饰handle()方法 PS:我正在使用python记录器 编辑 说到这里: 类父级(BaseCommand): 定义初始化(self,*arg

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

我想在命令的开始和结束处记录类似于
[command\u name]command start
[command\u name]command finished
的内容,这样我就不会在每个命令中重复我自己了

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

PS:我正在使用python记录器

编辑 说到这里:

类父级(BaseCommand):
定义初始化(self,*args,**kwargs):
info(f'started{self.\uuuuu模块\uuuuu}')
super()
info(f'finished{self.\uuuuu模块\uuuuu})
输出:

>已启动命令\u名称
>已完成的命令\u名称
>实际命令日志

编写一个基类,所有命令都将从该基类继承并在其中进行日志记录。记录输出的一个好地方是重写命令的
execute
方法(您的代码以错误的顺序记录,因为该命令实际上不是由
\uuuu init\uuuu
方法运行的,它实际上是使用类的
run\u from\u argv
方法对类单独调用的):

从django.core.management.base导入BaseCommand作为DjangoBaseCommand
类BaseCommand(DjangoBaseCommand):
def执行(self、*args、**选项):
info(f'started{self.\uuuuu模块\uuuuu}')
output=super().execute(*args,**选项)
info(f'finished{self.\uuuuu模块\uuuuu})
返回输出
现在,对于所有命令,只需从该命令继承即可:

从某个应用程序导入BaseCommand
类MyCommand(BaseCommand):
#你的代码在这里

为什么不简单地让您的命令继承一个公共基类来完成这项工作呢?是的,我考虑过了。但是如何在日志中将命令名(从继承类)获取到concat呢?
self.\uuuuu module\uuuu
将为您提供子类的模块名。这是我的
\uuuu init\uuu
的顺序:1
logger.debug(f'started{self.\uuuu module\uuuu}')
2。调用
super()
logger.debug(f'finished{self.\uuuuu module\uuuuuu}'
但不知何故,我在控制台中得到了以下信息:1.启动命令\u name 2.完成命令\u name 3.实际命令日志(命令正在此处执行)不要重写创建实例时调用的
\uuuuu init\uuuuu
,但它实际上并不运行命令。就像我在下面的回答中所做的那样,重写
执行
。这实际上非常有效。非常感谢!