首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法运行依赖Django代码的芹菜任务

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

Stack Overflow用户
提问于 2019-11-04 08:03:26
回答 1查看 176关注 0票数 0

当我试图运行依赖django代码的芹菜任务时,我似乎有一个catch 22场景。

芹菜编码

代码语言:javascript
复制
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)

我遇到的问题是这一行

代码语言:javascript
复制
from letters.send_write_letter_reminders import send_write_letter_reminders

有了它,我得到:

代码语言:javascript
复制
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

应用服务器无法运行,但没有它,我得到:

代码语言:javascript
复制
NameError: name 'send_write_letter_reminders' is not defined

显然,我缺少一些关于如何将芹菜和Django放在一起的基本知识,但我看不见。有人能告诉我我做错了什么吗?

Update --我已经想出了一个解决这个问题的方法,其中包括将导入移到芹菜任务中。我知道这不是最好的练习。也许这能解释一下到底发生了什么。

代码语言:javascript
复制
@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)
EN

回答 1

Stack Overflow用户

发布于 2019-11-10 02:42:51

本质上,在执行os.environ.setdefault行之前,您不能进行任何django导入或导入任何依赖django的操作。您不必为从manage.py运行的任何东西担心这个问题,原因是os.environ.setdefault是manage.py的第一行。本质上,只需将django.confletter导入移到os.environ.setdefault下面,事情就会更好。根据您所使用的django版本的不同,您可能还需要在设置django.setup()之后显式调用DJANGO_SETTINGS_MODULE以完成django设置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58689297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档