2016-08-10 19 views
0

Ich versuche Sellery in mein Django-Projekt zu integrieren. Ich habe die Celery-Dokumentation verfolgt und kann eine einfache Hello-World-Aufgabe ausführen. Aber wenn ich versuche, meine Modelle in meine Aufgabendefinitionen zu importieren, erhalte ich die Ausnahme AppRegisteredNotReady. Ich finde einige ältere Diskussionen um diese Ausnahme, aber nichts Aktuelles. Vermutlich vermisse ich etwas ganz Einfaches.Django und Sellerie, AppRegisteredNotReady Ausnahme

Python 3.5, Django 1.9, Sellerie 3.1.23

Celery.py:

from __future__ import absolute_import 
import os 
from celery import Celery 
from django.conf import settings 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local') # pragma: no cover 

app = Celery('autopool') 
app.config_from_object('django.conf:settings') 
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS, force=True) 

@app.task(bind=True) 
def debug_task(self): 
    print('Request: {0!r}'.format(self.request)) # pragma: no cover 

autopool/init Py:

from __future__ import absolute_import 

from autopool.celery import app as celery_app # noqa 

apps/Pools/Aufgaben. py:

from __future__ import absolute_import 
from celery import shared_task 

@shared_task 
def send_period_mail(period_id): 
    print("Mail sent for period " + period_id) 

Ich beginne Sellerie mit dem Befehl:

celery -A autopool worker -l info 

Aus meiner Sicht, ich ausführen:

import .tasks send_period_mail 
send_period_mail(period_id=period.id) 

Das alles funktioniert.

aber wenn ich versuche, ein Modell, um die Aufgabe hinzuzufügen:

from __future__ import absolute_import 
from celery import shared_task 
from .models import Period 

@shared_task 
def send_period_mail(period_id): 
    print("Mail sent for period " + period_id) 

Jetzt, wenn ich versuche, Sellerie zu beginnen, ich die AppRegisteryNotReady erhalten: Apps sind noch nicht Ausnahme geladen.

Voll Stack-Trace: http://pastebin.com/kmJZLHpT

jemand eine Ahnung haben?

Antwort

0

Denn wenn die celery.py Datei Django importiert haben nicht die apps/Modellen noch geladen (so schlägt es das Modell from .models import Period zu importieren) bewegen, um den Import innerhalb der Funktion

@shared_task 
def send_period_mail(period_id): 
    from .models import Period 
    print("Mail sent for period " + period_id) 

so dass es nur dann geladen wird, wenn die Funktion aufgerufen wird (und Django ist bereit)

0

Marcos Antwort funktioniert. Danke, Marco.

Ich entdeckte auch, dass ich es beheben konnte, indem Sie die force=True aus der autodiscover_tasks() Einstellung entfernen.

Ändern app.autodiscover_tasks(lambda: settings.INSTALLED_APPS, force=True) zu app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

Verwandte Themen