如何在 old/different Django 项目布局中使用 Celery?

How to use Celery with old/different Django project layout?

我的 Django 1.6.5 项目具有以下布局:

project
├── reports
│   ├── __init__.py
│   ├── models.py
│   ├── tasks.py
│   ├── tests.py
│   ├── views.py
├── __init__.py
├── manage.py
├── celery.py
├── settings.py
├── urls.py

Django 和 Celery 建议的布局如下所示:

project
├── project
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── celery.py
├── reports
│   ├── __init__.py
│   ├── models.py
│   ├── tasks.py
│   ├── tests.py
│   ├── views.py
├── manage.py

我已经遵循 Celery 的 Django 项目教程 (http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html)。

问题是,当我尝试使用以下命令 运行 celery beat(来自 /home/project)时:

celery -A project worker -B

我得到:

ImportError: No module named project

这在使用建议的布局的测试项目中对我有用,但我无法让它与这个特定的布局一起工作,顺便说一下,我无法更改它。

这些是我的文件:

celery.py

from __future__ import absolute_import
import os, sys
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')

from django.conf import settings  # noqa

app = Celery('project')

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))

芹菜配置@settings.py:

# Celery settings
BROKER_URL = 'amqp://guest:guest@localhost//'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

tasks.py

from __future__ import absolute_import

from celery.decorators import periodic_task
from datetime import timedelta

@periodic_task(run_every=timedelta(seconds=5))
def test_periodic_task():
    print 'Testing periodic task..'

包含 project 模块的文件夹不在您的系统路径中。 运行 celery.py 时,当前工作目录 /path/to/project/ 添加到路径中,但需要添加上一级目录 /path/to/ 才能导入project 模块:

BASE_DIR = os.path.dirname(os.path.dirname(__FILE__))
sys.path.prepend(BASE_DIR)

你可以在类似

的命令中使用 --workdir
celery -A project worker -B --workdir /path/to/project

注意:项目目录应该有__init__.py个文件