Как преобразовать асинхронный результат Celery в данные Json? - PullRequest
1 голос
/ 13 мая 2019

В моем приложении Django я определил функцию с фильтром сельдерея @task.

   # tasks.py

   # import statements
   @app.task
   def categorise():
      # LOC
   return results # results should be returning json data   

Я использую метод .delay () Celery для вызова этой функции:

   def driver(self):
     results = categorise.delay()
     print("type of results: ", type(results))
     return results

Тип, возвращаемый в переменной результатов:

    type of results:  <class 'celery.result.AsyncResult'>

Я обнаружил следующую ошибку:

    Object of type 'AsyncResult' is not JSON serializable

В файл Django settings.py я добавил следующие конфигурации, но это не помогло:

    # REDIS related settings
    REDIS_HOST = 'localhost'
    REDIS_PORT = '6379'
    BROKER_URL = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
    BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600}
    CELERY_RESULT_BACKEND = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_RESULT_SERIALIZER = 'json'

Однако я не уверен, как результат асинхронизации может быть преобразован в данные json.

Обновление

Решение найдено.

Используйте .get () для получения вывода json.

     def driver(self):
        results = categorise.apply_async()
        final_results = results.get()
        return final_results
...