Python 按id获取结果失败

Python 按id获取结果失败,python,celery,Python,Celery,我正试图在我的烧瓶式网络应用程序中使用芹菜,并监视它的状态。我的想法是在会话中存储任务的id,并将其用于状态轮询 这是我的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

我正试图在我的烧瓶式网络应用程序中使用芹菜,并监视它的状态。我的想法是在会话中存储任务的id,并将其用于状态轮询

这是我的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)
除了主应用程序的文件web.py之外

@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'))
但当我试图获取任务的状态时,我得到的是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.

我做错了什么

您是否设置了芹菜\u MONGODB\u后端\u设置词典?本页向您展示了一个示例:


您是否设置了芹菜\u MONGODB\u后端\u设置词典?本页向您展示了一个示例:


Flask本身似乎无法从您的文件中正确获取配置。尝试显式指定它,看看是否有帮助:


另外,为了确定,Flask进程的stdout上是否有任何消息?

Flask本身似乎没有从您的文件中正确拾取配置。尝试显式指定它,看看是否有帮助:

另外,为了确定,烧瓶过程的标准输出上是否有任何消息?

您可以执行以下操作:

@app.route('/task_state/<task_id>')
def task_state(task_id):
    return celery.result.AsyncResult(task_id).state # from task.py
@app.route('/task\u state/'))
def任务状态(任务id):
从task.py返回芹菜.result.AsyncResult(task#u id).state
您需要使用芹菜的当前实例 芹菜

你可以这样做:

@app.route('/task_state/<task_id>')
def task_state(task_id):
    return celery.result.AsyncResult(task_id).state # from task.py
@app.route('/task\u state/'))
def任务状态(任务id):
从task.py返回芹菜.result.AsyncResult(task#u id).state
您需要使用芹菜的当前实例 西芹

app = Celery('anytaskname',backend="celery.backends.amqp:AMQPBackend")
它使用Django 1.8在Windows上运行,使用RabbitMQ代理在芹菜3.1.25上运行 试试像

app = Celery('anytaskname',backend="celery.backends.amqp:AMQPBackend")
它使用Django 1.8在Windows上运行,使用RabbitMQ代理在芹菜3.1.25上运行

我已经设置了芹菜\u RESULT\u DBURI-我认为它是一样的。我已经用字典勾选了选项-它是一样的。你说“它是一样的”是什么意思。我不确定您是否可以为mongodb使用芹菜\u RESULT\u DBURI。正如您所建议的,我尝试使用settings dict指定信息,但收到相同的错误“NotImplementedError:未配置结果后端”。确定。可能您可以共享错误stacktrace。问题可能在其他地方。我已经设置了芹菜\u RESULT\u DBURI-我认为它是一样的。我已经用字典勾选了选项-它是一样的。你说“它是一样的”是什么意思。我不确定您是否可以为mongodb使用芹菜\u RESULT\u DBURI。正如您所建议的,我尝试使用settings dict指定信息,但收到相同的错误“NotImplementedError:未配置结果后端”。确定。可能您可以共享错误stacktrace。问题可能在其他地方。实际上,解决方案是将芹菜实例作为应用程序参数传递给AsyncResult构造函数。实际上,解决方案是将芹菜实例作为应用程序参数传递给AsyncResult构造函数。此外,我已经切换到redis作为芹菜后端,并使用了对芹菜.backend.get_task_meta()的直接调用,我已经切换到redis作为芹菜后端,并使用了对芹菜.backend.get_task_meta()的直接调用