我用Flower监视芹菜任务。
我正在尝试更改任务的显示方式(在 Tasks 标签下),以使列表看起来更加“有条理”。
不幸的是,overriding the format_task
method有局限性:
task.args
和task.kwargs
是字符串表示形式,有时会被截断-显然是由于celery events limitations -而不是list / dict task.name
以外的每个字段都对HTML进行了转义首先,我想根据任务的状态(即SUCCESS
,FAILURE
)隐藏/显示任务,以便我可以隐藏不重要的子任务,除非它们失败。
我可以通过将所有显示的字段设置为空字符串来获得更近的信息:
if task.state == 'SUCCESS':
task.name = ''
task.args = ''
# [...]
task.runtime = 0.0
...仍然显示为空行。你知道我怎么能达到预期的结果吗?
第二,我正在尝试格式化任务自变量的显示方式。
我正在使用eval(task.args)
将参数转换回其原始类型,以便以后可以遍历它们的项目。对我来说,评估随机字符串似乎有些不安全,您会推荐一种比这样做更好的方法吗?
答案 0 :(得分:0)
我找到了一种解决方案,可以在调用(列表/字典)而不是字符串时获取任务的参数。
argsrepr
方法的kwargsrepr
和apply_async
参数允许为任务的参数指定自定义表示形式。
我创建了一个自定义的 Task 类,像这样覆盖了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)))
else:
...
for key, value in kwargs.items():
...
# Create and call the task with the reprs we just built
new_task = super().s(*args, **kwargs)
return new_task.apply_async(argsrepr=json.dumps(argsrepr), kwargsrepr=json.dumps(kwargsrepr))
然后我将此类用作任务的基础:
@shared_task(base=FlowerTask)
def test_task(*args, **kwargs):
return "OK !"
通过这种方式,任务的参数表示形式存储为JSON,我可以随后将其加载到Flower的format_task
中,并像对象而不是字符串一样使用它们:
def format_task(task):
task.args = json.loads(task.args)
if not task.args:
task.args = "( )"
else:
task.args = ', '.join(arg for arg in task.args)
# [...]
我仍然没有找到隐藏任务的方法。我想我可能需要调整Flower的CSS。