在我的Flask项目中,我将MongoDB用作Celery任务的代理,也用作任务结果的存储。我也想在DB中存储程序参数。在此示例中,我需要添加发起任务的人员的用户名。
CELERY_BROKER_URL = 'mongodb://localhost:27017/celery'
CELERY_RESULT_BACKEND = 'mongodb://localhost:27017/'
CELERY_MONGODB_BACKEND_SETTINGS = {
'database': 'production',
'taskmeta_collection': 'celery_tasks',
}
下面是celery \ backends \ mongodb.py的store_result部分
我添加了一个新字段来存储发起请求的人的用户名,这就是我遇到的问题。我需要能够将此传递给我的结果后端。现在,该字段正在添加。但是我无法将用户名传递给结果。我试图在celery结果中返回用户名作为参数(返回(finalop,用户名))。但这并没有添加到我创建的字段中。
def _store_result(self, task_id, result, state, arg1,traceback=None, request=None, **kwargs):
"""Added arg1 to retrieve username"""
"""Store return value and state of an executed task."""
meta = {
'_id': task_id,
'status': state,
'result': result,
'username':** I have to pass value here from arg1**,
'date_done': datetime.utcnow(),
'traceback': self.encode(traceback),
'children': self.encode(
self.current_task_children(request),
),
}
try:
self.collection.save(meta)
except InvalidDocument as exc:
raise EncodeError(exc)
return result
@app.route('/Home')
def func1():
codes = ["FIRF9","3BINV"]
oop = index.delay(codes)
emplist = []
who = {'uname': 'baru', 'pid':oop.task_id}
emplist.append(who)
user = mongo.db.tasks #storing in a seperate document 'tasks'
user.insert(emplist)
doc = mongo.db.tasks.find().limit(100)
return render_template('tasklist.html',data=doc)
@celery.task(name='celery_example.scrape')
def index(codes):
time.sleep(10)
***some opertaion here***
finalop.append(info)
return (finalop)
我也可以在mongodb后端中得到结果,但是用户名没有被添加。
_id : "b2d13a3b-2d0f-41a1-8229-8b6917c3dafb"
status : "SUCCESS"
result : Array of results
username : None
date_done : 2019-02-07 03:38:20.144
traceback : "null"
children : "[]"
现在我正在使用单独的文档来跟踪所有创建的任务,并且在查询结果后显示结果。但是我需要将uname字段移动到store_result meta。有什么办法可以做到这一点
_id : 5c5ba819fda59156c888987d
uname : "baru"
pid : "b2d13a3b-2d0f-41a1-8229-8b6917c3dafb"