[似乎在尝试运行依赖Django代码的celery任务时,我遇到了22个问题。
芹菜代码
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的基本知识,但是我看不到。谁能启发我做错了什么?
更新我为此提出了一个解决方案,其中涉及将导入移动到celery任务中。我知道这不是最佳做法。也许它可能有助于解释发生了什么。
@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.conf
和letter
导入移动到os.environ.setdefault
之下,一切应该会更好。根据您所使用的Django版本,在设置django.setup()
以完成django设置后,可能还需要显式调用DJANGO_SETTINGS_MODULE
。