Для 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, например 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 все еще находится в разработке, но вы можете установить ее из репозитория git, запустив pip install git+https://github.com/mher/flower.git
.
person
CtheSky
schedule
05.07.2018