无法运行依赖Django代码的芹菜任务



当我试图运行依赖于django代码的芹菜任务时,我似乎遇到了一个catch22场景。

芹菜代码

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings
from celery import shared_task
from celery import task
from letters.send_write_letter_reminders import send_write_letter_reminders
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app_name.settings')
app = Celery('app_name')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
app.conf.timezone = 'Europe/London'
# Load task modules from all registered Django app configs.
app.autodiscover_tasks(settings.INSTALLED_APPS)
@app.task(bind=True, name='send_letter_reminders')
def send_letter_reminders(slug=None):
send_write_letter_reminders(slug=slug)

我遇到的问题是,使用这条线路

from letters.send_write_letter_reminders import send_write_letter_reminders

用它我得到:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

应用程序服务器不会运行,但如果没有它,我会得到:

NameError: name 'send_write_letter_reminders' is not defined

很明显,我错过了一些关于如何将Celery和Django一起运行的基本知识,但我看不出来。有人能告诉我我做错了什么吗?

更新我为此想出了一个巧妙的解决方法,其中包括将导入移动到芹菜任务中。我意识到这不是最好的做法。也许这可能有助于解释发生了什么。

@app.task(bind=True, name='send_letter_reminders')
def send_letter_reminders(slug=None):
from letters.send_write_letter_reminders import send_write_letter_reminders
send_write_letter_reminders.send_write_letter_reminders(slug=slug)

本质上,在执行os.environ.setdefault行之前,您不能执行任何django导入或导入任何依赖django的内容。从manage.py运行任何程序都不必担心这一点,因为os.environ.setdefault是manage.py的第一行。从本质上讲,只需将django.confletter导入移动到os.environ.setdefault下方,事情就会更好地工作。根据您使用的django版本,您可能还需要在设置DJANGO_SETTINGS_MODULE后显式调用django.setup()来完成django设置。

相关内容

  • 没有找到相关文章

最新更新