Flask Celery - сохранить аргументы программы в Mongo CELERY_RESULT_BACKEND - PullRequest
0 голосов
/ 07 февраля 2019

В моем проекте Flask я использую MongoDB в качестве брокера для задач Celery, а также в качестве хранилища результатов задач.Я тоже хочу хранить программные аргументы в БД.В этом примере мне нужно добавить имя пользователя, который инициировал задачу.

CELERY_BROKER_URL = 'mongodb://localhost:27017/celery'
CELERY_RESULT_BACKEND = 'mongodb://localhost:27017/'

CELERY_MONGODB_BACKEND_SETTINGS = {
'database': 'production', 
'taskmeta_collection': 'celery_tasks',
}

Ниже находится раздел store_result celery \ backends \ mongodb.py

Я добавил новое поле для хранения имени пользователя, который инициировал запрос, и именно здесь яя застрялЯ должен быть в состоянии передать это моему бэкэнду результатапрямо сейчас поле добавляется.Но я не могу передать имя пользователя в результате.я попытался вернуть имя пользователя в качестве аргумента в результате сельдерея (return (finalop, username)).Но он не добавляется в поле, которое я создал.

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.py

@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.Есть ли способ достичь этого

_id    :    5c5ba819fda59156c888987d
uname    :    "baru"
pid    :    "b2d13a3b-2d0f-41a1-8229-8b6917c3dafb"
...