Почему HTTP API цветов не работает?

У меня есть рабочий проект цветка сельдерея. Теперь мне нужны некоторые сведения о задаче сельдерея с использованием http API цветка, но когда я делаю запрос на http API цветка на http://localhost:5555/api/task/info/task_id возвращает ошибку 500?

В цветочной странице все в порядке.

введите здесь описание изображения

При использовании запросов на получение http api произошла ошибка!

введите здесь описание изображения

Все шаги выполняются в документации Flower. Ведение журнала Flower, как показано ниже: введите здесь описание изображения


person Li Ziming    schedule 05.07.2018    source источник


Ответы (1)


Для 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
comment
Спасибо, это решено. Версия Conda не была последней. - person Li Ziming; 05.07.2018