Почему HTTP API HTTP получить информацию о задании не работает?
У меня есть рабочий проект с цветком сельдерея. Теперь мне нужны подробности задачи сельдерея с использованием flower http api, но когда я делаю запрос на flower http api на http://localhost:5555/api/task/info/task_id
это вернет 500 ошибку?
На странице цветов все в порядке.
При использовании запросов для получения http api произошла ошибка!
Все шаги следуют документации Цветка. Цветочная заготовка, как показано ниже:
1 ответ
Для цветка 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
лайк parent
, root
:
class Task(object):
...
_fields = (
...
'clock', 'client', 'root', 'root_id', 'parent', 'parent_id', 'children',
)
В сельдерее эти поля имеют определенные обработчики сериализации:
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
функция, сериализация делегируется сельдерею, если он доступен, или используйте ключи по умолчанию:
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 repo, запустив pip install git+https://github.com/mher/flower.git
,