AttributeError: объект 'AsyncResult' не имеет атрибута 'head'
AttributeError: объект 'AsyncResult' не имеет атрибута 'head'
В моем views.py
файле ошибка возникает в data = df.head(50)
, когда я запускаю и получаю данные как асинхронная фоновая задача.
Может ли кто-нибудь помочь мне здесь?
task.py
@shared_task
def eda_flow_task(path, mode):
sleep(30)
try:
with adls_client.open(path, mode) as f:
df = pd.read_csv(f, low_memory=False)
return 'data load success'
except Exception as e:
response_dict.update({'error': str(e)})
view.py
def eda_flow(request):
path = '/data/satyajit/us_amz.csv'
mode = 'rb'
df = eda_flow_task.delay(path, mode)
data = df.head(50)
json_records = data.reset_index().to_json(orient ='records')
data = []
data = json.loads(json_records)
context = {'data': data}
return render(request, "home/tables-simple.html", context)
Следующее утверждение неверно: df = eda_flow_task.delay(path, mode)
delay() возвращает AsyncResult, а не Pandas data-frame... Я даже не уверен, что вы можете вернуть data frame, поскольку он, вероятно, не является сериализуемым. Я, конечно, никогда не пробовал, поэтому не знаю. В случае, если это так, как я подозреваю (не сериализуемый), вы должны вернуть объект типа, который является сериализуемым, например, список объектов.
Ваша задача на самом деле возвращает строку data load success
или None в случае исключения.
Для того чтобы получить результат выполнения задания Celery, необходимо сделать следующее:
res = eda_flow_task.delay(path, mode).get() # NOTE: this blocks!
Как уже упоминалось выше, res, скорее всего, окажется жестко закодированной строкой.