2016-03-31 3 views
2

я борюсь с сельдерей не делать то, что утверждает, что его документация: У меня есть Джанго 1.9 приложения, и я бегу сельдерей 3.1.20 и у меня есть следующие:Джанго 1.9: CELERY_IMPORTS не работает

MYAPP/сельдерея .py:

from __future__ import absolute_import 
import os 

from celery import Celery 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings') 
from django.conf import settings # noqa 

app = Celery('myapp') 
app.config_from_object('django.conf:settings') 

MyApp/работы/tasks.py:

from myapp.celery import app 

class Job1(app.Task): 
    ... 
    name = 'job_1' 
    ... 


class Job2(app.Task): 
    ... 
    name = 'job_2' 
    ... 

Однако, я пытался как:

MyApp/settings.py:

CELERY_IMPORTS = ('myapp.jobs.tasks',) 

и

MyApp/celery.py:

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 

и ни регистрируете свои задачи должным образом. Задачи появляются только в app.tasks, как только я вручную импортирую модуль, который определяет задачи, поэтому я должен был сделать уродливый локальный импортный взлом, когда я использую задачу для обеспечения ее загрузки.

В Джанго оболочки:

In [1]: from myapp.celery import app 

In [2]: app.tasks 
Out[2]: 
{'celery.backend_cleanup': <@task: celery.backend_cleanup of myapp:0x10dc260d0>, 
'celery.chain': <@task: celery.chain of myapp:0x10dc260d0>, 
'celery.chord': <@task: celery.chord of myapp:0x10dc260d0>, 
'celery.chord_unlock': <@task: celery.chord_unlock of myapp:0x10dc260d0>, 
'celery.chunks': <@task: celery.chunks of myapp:0x10dc260d0>, 
'celery.group': <@task: celery.group of myapp:0x10dc260d0>, 
'celery.map': <@task: celery.map of myapp:0x10dc260d0>, 
'celery.starmap': <@task: celery.starmap of myapp:0x10dc260d0>} 

In [3]: app.conf['CELERY_IMPORTS'] 
Out[3]: ('myapp.jobs.tasks',) 

In [4]: from myapp.jobs import tasks 

In [5]: app.tasks 
Out[5]: 
{'celery.backend_cleanup': <@task: celery.backend_cleanup of myapp:0x10dc260d0>, 
'celery.chain': <@task: celery.chain of myapp:0x10dc260d0>, 
'celery.chord': <@task: celery.chord of myapp:0x10dc260d0>, 
'celery.chord_unlock': <@task: celery.chord_unlock of myapp:0x10dc260d0>, 
'celery.chunks': <@task: celery.chunks of myapp:0x10dc260d0>, 
'celery.group': <@task: celery.group of myapp:0x10dc260d0>, 
'celery.map': <@task: celery.map of myapp:0x10dc260d0>, 
'celery.starmap': <@task: celery.starmap of myapp:0x10dc260d0>, 
'job_1': <@task: job_1 of myapp:0x10dc260d0>, 
'job_2': <@task: job_2 of myapp:0x10dc260d0>, 
'job_3': <@task: job_3 of myapp:0x10dc260d0>} 

Любые идеи, что здесь происходит? Он просто не загружает задачи, пока я сам не импортирую модуль.

Заранее благодарен.

+0

FTR В основном я вижу @ app.task (...) синтаксис для объявления задач, поэтому, чтобы выяснить, почему я использую классы, у меня есть несколько параметров, настроенных на них, которые я не могу сделать/запутаться, если я используйте декоратор; такие вещи, как time_limit, max_retries и т. п., а также некоторые утилиты для задач, которые делают классы более удобными. –

ответ

1

Имеет ту же проблему и изменил пунктирный путь python на конфигурацию приложения в INSTALLED_APPS в settings.py приложения, о котором идет речь, только с именем модуля с приложением и, похоже, работает (на данный момент). В Django 1.9 он выглядит так: INSTALLED_APPS может либо взять точечный путь python к файлу конфигурации приложения, либо просто имя модуля, как в более ранних версиях.

+1

Похоже, сельдерейу не хватает обновления, чтобы привести его в соответствие с более новым способом объявления установленных приложений. Конечно, это не сработало бы для меня, даже когда я объявлял CELERY_IMPORTS списком точных модулей вместо того, чтобы полагаться на технику INSTALLED_APPS, поэтому я все еще не уверен, что там происходит. Я закончил тем, что отказался и просто придерживался местного импорта. –