在项目中导入celery失败,在manage.py shell中工作(排序)

时间:2013-06-28 11:48:24

标签: django celery django-celery

我在这里查看此列表但我无法正常工作:

http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html

所以我做的是: 1)下载芹菜模块并将它们添加到我的manage.py和wsgi.py:

# -*- coding: utf-8 -*-
#!/usr/bin/env python
import os, sys
from ConfigParser import RawConfigParser

config = RawConfigParser()
abspath = os.path.abspath(os.path.dirname(__file__))

config.read(abspath+'/subfolder/settings.ini')

homedir = config.get('paths', 'libspath')
projectspath = config.get('paths', 'projectspath')

path = [
    '/Django-1.4.5/', 
    '/South-0.7.6',
    '/python-openid-master',#07.05.2013 checkout from https://github.com/openid/python-openid
    '/mbi-django-rosetta-eca151e',
    '/phonenumbers-5.2b1',
    '/django-phonenumber-field-develop',
    '/django-openid-auth-0.5',
    '/celery-3.0.19',
    '/django-celery-3.0.17',
    '/kombu-2.5.11',
    '/billiard-2.7.3.28',
    '/anyjson-0.3.3',
    '/amqp-1.0.12'
    ]

for item in path:
    module = homedir+item
    if module not in sys.path:
        sys.path.append(module)

2)安装了rabbitmq 3)在settings.py中设置东西:

INSTALLED_APPS = (
    ---
    'djcelery',
)

最后:

BROKER_URL = 'amqp://guest:guest@localhost:5672/'
import djcelery
djcelery.setup_loader()

4)运行python manage.py syncdb

5)因为即时通讯使用mod_wsgi我也将它添加到我的wsgi.py(除了我之前展示的代码)

import djcelery
djcelery.setup_loader()

6)我在我的核心应用中创建了tasks.py:

import logging, subprocess
logger = logging.getLogger('debugger')

from django.conf import settings

from celery import task

@task
def runfunc(funcname, refno):
    x = 'nothing to see here'

7)我运行:python manage.py芹菜工人--loglevel = info 得到一大堆东西意味着一切都好:P。

但是当我去django视图时应该运行我得到的任务:

cannot import name task
Request Method: GET
Request URL:    http://localhost/url/that/triggers/task/
Django Version: 1.4.5
Exception Type: ImportError
Exception Value:    
cannot import name task
Exception Location: /path/to/project/core/tasks.py in <module>, line 6

当我去manage.py shell并输入 从芹菜进口任务 - 它工作得很好。 如果我从core.tasks导入函数,那么我得到完全相同的错误消息。

任何人都可以向我解释一下这里......

艾伦

2 个答案:

答案 0 :(得分:5)

尝试将tasks.py更改为:

from __future__ import absolute_import
from celery import task

您可能在与导致错误的模块(celery/)相同的目录中有celery.pytasks.py,并且这是作为相对导入失败的。

答案 1 :(得分:1)

Yikes,你在第一步中从哪里得到了所有这些?我从来没有必要更改manage.pywsgi.py文件来运行其他程序包。你说“下载芹菜模块”,然后你有所有sys.path更改代码。这让我相信您没有使用pipvirtualenv。使用这两种工具可以大大简化您的生活。你会简化事情,你的团队会永远爱你。当存在Python包管理时,不要过度复杂化以免这种痛苦。路径修改很少是必要的。

您引用的那些Celery first steps实际上只需要它。看起来你已经处理了那个特殊的mod_wsgi注释。我的猜测是问题出在第一步 - 无论你对manage.py和wsgi.py做了哪些修改。所有其他步骤看起来都很好*。

我会复制你的代码,创建一个新的virtualenv,pip安装这些包并删除所有路径设置的东西。使用django-admin.py startproject xxx查看普通香草manage.pywsgi.py文件的外观。还可以使用DEBUG=True来帮助进行问题排查。如果有效并且您已解决问题,请使用点requirements file替换settings.ini

*您使用South,请记住python manage.py migrate djcelery。 (在第4步中,您只使用syncdb)。我不相信这样做会解决导入错误,但在更大的图片中这是必要的。