为什么 flower 的 HTTP API 获取任务信息不起作用?

Why flower's HTTP API get task info not work?

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

花页一切正常。

使用请求获取 http api 时发生错误!

遵循所有步骤Flower's documentation。 Flower 日志记录如下:

对于 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 中有任务对象,例如 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,
}

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

我认为它已在 flower 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.

从 git 存储库安装它