Python 花卉中的高级任务格式化(芹菜监控)
我用花来监控我的芹菜任务 我正在尝试更改任务的显示方式(在“任务”选项卡下),以使列表看起来更有条理。例如,显示Python 花卉中的高级任务格式化(芹菜监控),python,task,celery,display,flower,Python,Task,Celery,Display,Flower,我用花来监控我的芹菜任务 我正在尝试更改任务的显示方式(在“任务”选项卡下),以使列表看起来更有条理。例如,显示而不是[1,2,3,… 不幸的是,它有以下局限性: task.args和task.kwargs是字符串表示,通常被截断,而不是list/dict 除了task.name 如果函数没有返回值,则在显示任务时会抛出AJAX错误 要返回原始的args和kwargs对象,我使用eval(task.args)这样我以后就可以遍历它们的项。对我来说,计算随机字符串看起来有点不安全,你能推荐一种
而不是[1,2,3,…
不幸的是,它有以下局限性:
和task.args
是字符串表示,通常被截断,而不是list/dicttask.kwargs
- 除了
task.name
- 如果函数没有返回值,则在显示任务时会抛出AJAX错误
要返回原始的
args
和kwargs
对象,我使用eval(task.args)
这样我以后就可以遍历它们的项。对我来说,计算随机字符串看起来有点不安全,你能推荐一种更好的方法吗?我找到了一个解决方案,可以将任务的参数以格式\u task
作为对象(列表/目录等),而不是截断的字符串表示形式
apply\u async()
方法的argsrepr
和kwargsrepr
参数允许为任务的参数指定自定义表示
我创建了一个自定义任务类,覆盖了delay
方法,如下所示:
import json
from celery import Task
class FlowerTask(Task):
def delay(self, *args, **kwargs):
argsrepr, kwargsrepr = [], {}
for arg in args:
if isinstance(arg, bytes):
argsrepr.append("<binary content>")
elif isinstance(arg, list):
argsrepr.append("<list ({} items)>".format(len(arg)))
elif isinstance(arg, dict):
argsrepr.append("<dict ({} keys)>".format(len(arg)))
else:
# Format your args the way you prefer
for key, value in kwargs.items():
# Format your kwargs the same way as above
# if ... :
# kwargsrepr.append(...)
# Create the task
new_task = super().s(*args, **kwargs)
# Use our representations as JSON
return new_task.apply_async(
argsrepr=json.dumps(argsrepr),
kwargsrepr=json.dumps(kwargsrepr)
)
这样,任务的参数表示形式存储为JSON,可以在Flower的format_task()
中加载,并将其用作对象而不是字符串:
def format_task(task):
argsrepr = json.loads(task.args)
kwargsrepr = json.loads(task.kwargs)
if not argsrepr:
task.args = "( )"
else:
task.args = ', '.join(argsrepr)
if not kwargsrepr:
task.kwargs = "( )"
else:
task.kwargs = ', '.join(f'{key} = {value}' for key, value in kwargsrepr.items())
# [...]
通过这种方式,参数显示如下:
参数:,
Kwargs:callback=,items=
def format_task(task):
argsrepr = json.loads(task.args)
kwargsrepr = json.loads(task.kwargs)
if not argsrepr:
task.args = "( )"
else:
task.args = ', '.join(argsrepr)
if not kwargsrepr:
task.kwargs = "( )"
else:
task.kwargs = ', '.join(f'{key} = {value}' for key, value in kwargsrepr.items())
# [...]