Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.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 花卉中的高级任务格式化(芹菜监控)_Python_Task_Celery_Display_Flower - Fatal编程技术网

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
    task.kwargs
    是字符串表示,通常被截断,而不是list/dict
  • 除了
    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())
    # [...]