2

我有一个正在工作的芹菜花项目。现在我想要一些使用花 http api 的芹菜任务详细信息,但是当我在http://localhost:5555/api/task/info/上的花 http api 发出请求时,task_id它返回 500 错误?

花页里一切都好。

在此处输入图像描述

在使用requests获取http api时,发生了一些错误!

在此处输入图像描述

所有步骤都遵循Flower 的文档。花日志如下: 在此处输入图像描述

4

1 回答 1

2

对于flower 0.9.2,它尝试将每个属性task._fields放入响应中:

def get(self, taskid):
    ...
    response = {}
    for name in task._fields:
        if name not in ['uuid', 'worker']:
            response[name] = getattr(task, name, None)
    response['task-id'] = task.uuid
    if task.worker is not None:
        response['worker'] = task.worker.hostname
    self.write(response)

原来有task._fields类似的Task对象parentroot

class Task(object):
    ...
    _fields = (
        ...
        'clock', 'client', 'root', 'root_id', 'parent', 'parent_id', 'children',
    )

在 celery 中,这些字段具有特定的序列化处理程序:

self._serializer_handlers = {
    'children': self._serializable_children,
    'root': self._serializable_root,
    'parent': self._serializable_parent,
}

在开花时,它只是将它传递给它self.write,它不知道如何序列化这些对象。

我认为它已在花 1.0.0 中修复:

def get(self, taskid):
    ...
    response = task.as_dict()
    if task.worker is not None:
        response['worker'] = task.worker.hostname

    self.write(response)

as_dict函数中,如果可用或使用默认键,则将序列化委托给 celery:

def as_dict(task):
    # as_dict is new in Celery 3.1.7
    if hasattr(Task, 'as_dict'):
        return task.as_dict()
    # old version
    else:
        return task.info(fields=task._defaults.keys())

版本 1.0.0 仍在开发中,但您可以通过运行pip install git+https://github.com/mher/flower.git.

于 2018-07-05T05:17:39.970 回答