如何在 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
个文件
我的 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
个文件