V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cbsw
V2EX  ›  Django

[求助 celery+django] ImportError

  •  
  •   cbsw ·
    dengshuan · 2014-09-02 13:21:28 +08:00 · 3818 次点击
    这是一个创建于 3844 天前的主题,其中的信息可能已经有所发展或是发生改变。
    项目用的是 django 1.3,芹菜官方文档给的是 modern django 的例子,折腾好久总是各种问题,这个 gist 里问题是从 web 端发的 task 报错,而从 shell 里发的正常执行
    from __future__ import absolute_import
    from .mycelery import app as celery_app
    view raw __init__.py hosted with ❤ by GitHub
    from __future__ import absolute_import
    import os
    from celery import Celery
    from django.conf import settings
    # set the default Django settings module for the 'celery' program.
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
    app = Celery('myproj', backend='redis://localhost', broker='redis://localhost:6379/0')
    # Using a string here means the worker will not have to
    # pickle the object when using Windows.
    app.config_from_object('django.conf:settings')
    app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
    @app.task(bind=True)
    def debug_task(self):
    print('Request: {0!r}'.format(self.request))
    view raw mycelery.py hosted with ❤ by GitHub
    # Django settings for myproj project.
    DEBUG = True
    TEMPLATE_DEBUG = DEBUG
    ADMINS = (
    # ('Your Name', 'your_email@example.com'),
    )
    MANAGERS = ADMINS
    DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
    'NAME': '', # Or path to database file if using sqlite3.
    'USER': '', # Not used with sqlite3.
    'PASSWORD': '', # Not used with sqlite3.
    'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
    'PORT': '', # Set to empty string for default. Not used with sqlite3.
    }
    }
    # Local time zone for this installation. Choices can be found here:
    # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
    # although not all choices may be available on all operating systems.
    # On Unix systems, a value of None will cause Django to use the same
    # timezone as the operating system.
    # If running in a Windows environment this must be set to the same as your
    # system time zone.
    TIME_ZONE = 'America/Chicago'
    # Language code for this installation. All choices can be found here:
    # http://www.i18nguy.com/unicode/language-identifiers.html
    LANGUAGE_CODE = 'en-us'
    SITE_ID = 1
    # If you set this to False, Django will make some optimizations so as not
    # to load the internationalization machinery.
    USE_I18N = True
    # If you set this to False, Django will not format dates, numbers and
    # calendars according to the current locale
    USE_L10N = True
    # Absolute filesystem path to the directory that will hold user-uploaded files.
    # Example: "/home/media/media.lawrence.com/media/"
    MEDIA_ROOT = ''
    # URL that handles the media served from MEDIA_ROOT. Make sure to use a
    # trailing slash.
    # Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
    MEDIA_URL = ''
    # Absolute path to the directory static files should be collected to.
    # Don't put anything in this directory yourself; store your static files
    # in apps' "static/" subdirectories and in STATICFILES_DIRS.
    # Example: "/home/media/media.lawrence.com/static/"
    STATIC_ROOT = ''
    # URL prefix for static files.
    # Example: "http://media.lawrence.com/static/"
    STATIC_URL = '/static/'
    # URL prefix for admin static files -- CSS, JavaScript and images.
    # Make sure to use a trailing slash.
    # Examples: "http://foo.com/static/admin/", "/static/admin/".
    ADMIN_MEDIA_PREFIX = '/static/admin/'
    # Additional locations of static files
    STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    )
    # List of finder classes that know how to find static files in
    # various locations.
    STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    # 'django.contrib.staticfiles.finders.DefaultStorageFinder',
    )
    # Make this unique, and don't share it with anybody.
    SECRET_KEY = '@!%8^i4i$9n860u^#7_z#87$+$4j$h_vjn8%0zi42=zcp$(3_2'
    # List of callables that know how to import templates from various sources.
    TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
    # 'django.template.loaders.eggs.Loader',
    )
    MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    )
    ROOT_URLCONF = 'myproj.urls'
    TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    )
    INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'app1',
    )
    # A sample logging configuration. The only tangible logging
    # performed by this configuration is to send an email to
    # the site admins on every HTTP 500 error.
    # See http://docs.djangoproject.com/en/dev/topics/logging for
    # more details on how to customize your logging configuration.
    LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
    'mail_admins': {
    'level': 'ERROR',
    'class': 'django.utils.log.AdminEmailHandler'
    }
    },
    'loggers': {
    'django.request': {
    'handlers': ['mail_admins'],
    'level': 'ERROR',
    'propagate': True,
    },
    }
    }
    view raw settings.py hosted with ❤ by GitHub
    from __future__ import absolute_import
    from celery import shared_task
    @shared_task
    def add(x, y):
    return x + y
    @shared_task
    def mul(x, y):
    return x * y
    @shared_task
    def xsum(numbers):
    return sum(numbers)
    view raw tasks.py hosted with ❤ by GitHub
    from django.conf.urls.defaults import patterns, include, url
    # Uncomment the next two lines to enable the admin:
    # from django.contrib import admin
    # admin.autodiscover()
    urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'myproj.views.home', name='home'),
    # url(r'^myproj/', include('myproj.foo.urls')),
    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
    # Uncomment the next line to enable the admin:
    # url(r'^admin/', include(admin.site.urls)),
    url(r'^index', 'myproj.app1.views.index'),
    )
    view raw urls.py hosted with ❤ by GitHub
    # Create your views here.
    from django.http import HttpResponse
    from tasks import add
    def index(request):
    add.apply_async(args=[1,2], countdown=30)
    return HttpResponse("Hello,world!")
    view raw views.py hosted with ❤ by GitHub


    Stack Overflow 上问了半天没人回答( http://stackoverflow.com/questions/25614718/celery-with-django-1-3-keyerror-myproj-app1-tasks-add ),然后自己各种尝试,发现把 *views.py* 中 `from tasks import add` 改成 `from app1.tasks import add` 就可以了

    但是项目中都是用 `from myproj.app1.module import something` 这种风格的 `import`,但是这种方式 celery server 直接启动不了,出现 **ImportError:No module named xxx**

    有没有大神帮忙分析一下
    5 条回复    2014-09-02 19:39:22 +08:00
    cbsw
        1
    cbsw  
    OP
       2014-09-02 13:23:58 +08:00
    为什么我用不了 Markdown 呢,还没有对所有人公开么? @Livid
    bcxx
        2
    bcxx  
       2014-09-02 13:36:54 +08:00
    升级一下 django 会更简单吧……
    cbsw
        3
    cbsw  
    OP
       2014-09-02 14:10:19 +08:00
    @bcxx 这个不是由我说了算的,而且升级过程中也会有大量问题的
    wenbinwu
        4
    wenbinwu  
       2014-09-02 15:37:04 +08:00
    from .tasks import add
    cbsw
        5
    cbsw  
    OP
       2014-09-02 19:39:22 +08:00   ❤️ 1
    @wenbinwu @bcxx 问题已解决,看了下 celery 源码,找到 import 部分发现只在当前目录和子目录查找模块,所以老版本的 django project(mycelery.py上层) 不在 celery 路径中,直接在 mycelery.py 中加上 `sys.path.append(os.path.abspath(os.pardir))` 把上层目录即 project 的路径加入即可,还是沿用了项目中的 `from projectname.appname.modulename import something` 的格式不变。

    ImportError 多半是路径导致的,碰到这样问题应该先检查一下路径的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3542 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:27 · PVG 12:27 · LAX 21:27 · JFK 00:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.