2012-11-08 75 views
1

我想在我的基於瓶的web應用程序中使用芹菜並監視它的狀態。我的想法是將任務的ID存儲在會話中,並將其用於狀態輪詢。通過id獲取結果失敗

這裏是除了從主應用程序的文件web.py我tasks.py

from traceback import format_exc 
import settings 
from celery import Celery, current_task 
from celery.utils.log import get_task_logger 
from celery.result import AsyncResult 

from nimble_auth import make_nimble_req 

logger = get_task_logger(__name__) 

celery = Celery('tasks') 
celery.config_from_object(settings) 

@celery.task 
def make_work(param1, param2): 
    try: 
     # work here 
     current_task.update_state(state='PROGRESS', meta={'current': page, 'total': total_pages}) 
    except StandardError: 
     logger.error(format_exc()) 

def get_asynctask(task_id): 
    return AsyncResult(task_id) 

的內容

@app.route('/task_state/<task_id>') 
def task_state(task_id): 
    return get_asynctask(task_id).state # from task.py 

@app.route('/reset_task') 
def reset_task(): 
    del session['celery_task_id'] 
    return redirect(url_for('index')) 

@app.route('/run') 
def run_task(): 
    task = make_work.delay(1, 2) 
    session['celery_task_id'] = task.task_id 
    flash('Task submitted OK!') 

    return redirect(url_for('index')) 

設置文件:

BROKER_URL = 'mongodb://localhost:27017/dramba' 
CELERY_RESULT_BACKEND = "mongodb" 
CELERY_RESULT_DBURI = 'mongodb://localhost:27017/dramba' 

但是,當我試圖獲取任務的狀態,我得到NotImplementedError:沒有配置後端結果。

完整堆棧跟蹤:

Traceback (most recent call last): 
    File "/Users/cleg/Projects/Venvs/Dramba/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/Users/cleg/Projects/Venvs/Dramba/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/Users/cleg/Projects/Venvs/Dramba/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/Users/cleg/Projects/Venvs/Dramba/lib/python2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/Users/cleg/Projects/Venvs/Dramba/lib/python2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/Users/cleg/Projects/Venvs/Dramba/lib/python2.7/site-packages/flask/app.py", line 1344, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/Users/cleg/Projects/GitHub/Dramba/dramba.py", line 13, in task_state 
    return get_asynctask(task_id).state 
    File "/Users/cleg/Projects/Venvs/Dramba/lib/python2.7/site-packages/celery/result.py", line 284, in state 
    return self.backend.get_status(self.id) 
    File "/Users/cleg/Projects/Venvs/Dramba/lib/python2.7/site-packages/celery/backends/base.py", line 490, in _is_disabled 
    raise NotImplementedError('No result backend configured. ' 
NotImplementedError: No result backend configured. Please see the documentation for more information. 

我在做什麼錯?

+0

另外,我swithed到Redis的芹菜後端和用於直接調用芹菜.backend.get_task_meta() – cleg

回答

0

您是否設置了CELERY_MONGODB_BACKEND_SETTINGS字典?這個頁面給出了一個例子:

http://docs.celeryproject.org/en/latest/configuration.html#mongodb-backend-settings

CELERY_RESULT_BACKEND = "mongodb" 
CELERY_MONGODB_BACKEND_SETTINGS = { 
* "host": "192.168.1.100", 
* "port": 30000, 
* "database": "mydb", 
* "taskmeta_collection": "my_taskmeta_collection", 
} 
+0

我設置了CELERY_RESULT_DBURI - 我認爲它是一樣的。我用字典檢查了選項 - 這是一樣的。 – cleg

+0

你是什麼意思「它是一樣的」。我不確定您是否可以將CELERY_RESULT_DBURI用於mongodb。 – codegeek

+0

我試過使用設置字典來指定信息,正如您所建議的那樣,但收到相同的錯誤「NotImplementedError:沒有配置後端結果。」 – cleg

0

你可以這樣做:

@app.route('/task_state/<task_id>') 
def task_state(task_id): 
    return celery.result.AsyncResult(task_id).state # from task.py 

您需要使用芹菜 的當前實例Надоиспользоватьужесуществующийэкземпляр芹菜

相關問題