对于花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对象,比如parent,root:
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 从 git repo 安装它。