Flask-jsonify Celery任务结果

时间:2019-05-04 19:43:27

标签: python celery flask-restful

我有很长的芹菜任务:

@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

0 个答案:

没有答案