【发布时间】:2013-08-08 09:28:12
【问题描述】:
我正在拼命想让 Celery 与 Django 很好地配合,但无济于事。我被以下问题绊倒了:
项目/settings.py:
...
import djcelery
djcelery.setup_loader()
BROKER_URL = 'django://'
CELERY_RESULT_BACKEND = 'django://'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = True
...
app/tasks.py:
from celery.task import task
@task()
def scheduled_task(param1, param2):
...
return something
直接调用scheduled_task(param1, param2)(没有装饰器)按预期工作。然而,当添加装饰器并像这样启动“开发”芹菜工人时:
python manage.py celery worker --loglevel=info
...我收到以下错误:
TypeError: 'module' object is not callable
我已将其固定在 @task 装饰器上。我尝试的每个组合都失败了,包括:
from celery import task
from celery.task import task
from celery.task.base import task
@task
@task()
@task.task
@task.task()
@celery.task
@celery.task()
似乎对异常中的调用堆栈没有任何影响,他们都似乎认为task 是一个模块,而不是可调用的!让事情变得更令人沮丧:
>>> from celery.task import task
>>> task
<function task at 0x10aa2a758>
这对我来说确实可以调用!知道会发生什么吗?如果我遗漏了什么,我很乐意发布额外的日志、文件或澄清其他任何事情。
【问题讨论】:
-
可能听起来很明显,但是如果您将所有文件都放在同一个目录中怎么办?另外,你的 manage.py 文件中有什么?
-
这种令人沮丧的几乎总是是一些被忽视的愚蠢显而易见的事情,没有什么问题是愚蠢的! manage.py 文件目前如下所示:pastebin.com/JaaznH2K
-
关于目录结构,您是指我的 Django 项目中的文件(它们遵循 Django 1.5 的标准项目模板)还是
django-celery或celery库/应用程序中的文件? -
@TrojanCentaur 太棒了,谢谢!由此我认为
return backend(app=self, url=url)是异常发生的地方。所以无论backend是什么,它似乎都不是可调用的。我会尝试在该文件(celery/app/base.py)中设置一个 pdb 断点,方法是将该行包装在try: ... except: import pdb; pdb.set_trace()中,然后检查backend,然后向上移动堆栈(pdb 中的u命令)以调试所有位置出错了。 -
@LukasGraf 3.0.21 在
celery和django-celery上(通过 pip 安装到 Mac OSX 10.8 上)
标签: python django celery django-celery