我有很长的芹菜任务:
@celery.task(queue='cache')
def cache_user_tracks(user_id):
# generator - yields external api calls
tracks = sp_utilities.query_tracks()
while True:
result = Upload_Track(dataset=next(tracks),
user_id=user_id)
return {'Status': 'Tracks uploaded!'}
,我想在完成后作为有效的JSON
RESTful
返回。
这是到目前为止我对响应对象所拥有的:
@task_bp.route('/tracks/<user_id>', methods=['POST'])
def cache_user(user_id):
response_object = {
'status': 'fail',
'message': 'User does not exist'
}
try:
user = User.query.filter_by(id=user_id).first()
if not user:
return jsonify(response_object), 404
else:
task = cache_user_tracks.apply_async([user_id])
if task.ready() == True:
response_object = {
'status': 'success',
'data': {
'task_id': task.id,
'username': user.username,
'results': task.get()
}
}
return jsonify(response_object), 202
except (exc.IntegrityError, ValueError):
db.session.rollback()
return jsonify(response_object), 404
正在成功使用任务。但是到目前为止,我的响应对象是为消耗任务之前的响应而设计的。
那我该如何将任务结果作为json化数据返回,就像这样:
response_object = {
'status': 'success',
'data': {
'task_id': task.id,
'results': user.username,
'tracks': # results here
}
}
任务完成后是否在'/tracks/<user_id>'
?
注意:
任务完成后,我得到了以下记录的追溯(这似乎不是一个错误,因为所有数据都已添加到数据库中):
[2019-05-04 17:46:27,349: ERROR/ForkPoolWorker-5] Task project.api.routes.background.cache_user_tracks[f5d862f1-0b37-4b6b-9438-0df65c85fb24] raised unexpected: StopIteration()
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/celery/app/trace.py", line 382, in trace_task
R = retval = fun(*args, **kwargs)
File "/usr/lib/python3.6/site-packages/celery/app/trace.py", line 641, in __protected_call__
return self.run(*args, **kwargs)
File "/usr/src/app/project/api/routes/background.py", line 138, in cache_user_tracks_with_analysis
result = Upload_Track(dataset=next(track),
StopIteration