Celery autodiscover_tasks 不适用于所有 Django 1.7 应用程序
Celery autodiscover_tasks not working for all Django 1.7 apps
我有一个 Django 1.7 项目和 Celery 3.1。我的 Django 项目中的所有应用程序都使用新的 AppConfig。问题是不是所有的任务都用 autodiscover_tasks
:
找到
app.autodiscover_tasks(settings.INSTALLED_APPS)
如果我像这样使用 autodiscover_tasks 它将起作用:
app.autodiscover_tasks(settings.INSTALLED_APPS + ('apps.core','apps.sales'))
找到网站定义的任务,但找不到核心和销售中的任务。 apps.py
和 tasks.py
都具有相同的布局。
项目文件夹结构为:
apps
core
apps.py
tasks.py
dashboard
apps.py
sales
apps.py
tasks.py
websites
apps.py
tasks.py
class定义如下:
class WebsitesConfig(AppConfig):
name = 'apps.websites'
verbose_name = 'Websites'
class SalesConfig(AppConfig):
name = 'apps.sales'
verbose_name = 'Sales'
这在许多 Celery 问题中都有讨论,例如 #2596 and #2597。
如果您使用的是 Celery 3.x,解决方法是使用:
from django.apps import apps
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()])
如#3341中所述,如果您使用的是 Celery 4.x(即将发布),您可以使用:
app.autodiscover_tasks()
我必须将它添加到定义我的 celery 应用程序的模块中:
from __future__ import absolute_import
由于虚拟环境配置错误,我刚刚遇到了这个问题。
如果已安装的应用程序在您 运行 celery 所在的虚拟环境中缺少依赖项,则不会自动发现已安装应用程序的任务。当我从同一台机器上的 运行 我的网络服务器和芹菜转移到分布式解决方案时,这让我很震惊。错误的构建导致不同节点上的不同环境文件。
我添加了缺少的依赖项,然后重新启动了 celery 服务。
我的问题是 celery 命令中 celery.py
的路径错误。
命令应该是这样的:
celery worker -A <project_name.celery_app_module> -l info
其中芹菜celery_app_module
是这样的:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# Set default Django settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<project_name>.settings')
app = Celery('<project_name>', include=['<app_name>.tasks'])
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
我有一个 Django 1.7 项目和 Celery 3.1。我的 Django 项目中的所有应用程序都使用新的 AppConfig。问题是不是所有的任务都用 autodiscover_tasks
:
app.autodiscover_tasks(settings.INSTALLED_APPS)
如果我像这样使用 autodiscover_tasks 它将起作用:
app.autodiscover_tasks(settings.INSTALLED_APPS + ('apps.core','apps.sales'))
找到网站定义的任务,但找不到核心和销售中的任务。 apps.py
和 tasks.py
都具有相同的布局。
项目文件夹结构为:
apps
core
apps.py
tasks.py
dashboard
apps.py
sales
apps.py
tasks.py
websites
apps.py
tasks.py
class定义如下:
class WebsitesConfig(AppConfig):
name = 'apps.websites'
verbose_name = 'Websites'
class SalesConfig(AppConfig):
name = 'apps.sales'
verbose_name = 'Sales'
这在许多 Celery 问题中都有讨论,例如 #2596 and #2597。
如果您使用的是 Celery 3.x,解决方法是使用:
from django.apps import apps
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()])
如#3341中所述,如果您使用的是 Celery 4.x(即将发布),您可以使用:
app.autodiscover_tasks()
我必须将它添加到定义我的 celery 应用程序的模块中:
from __future__ import absolute_import
由于虚拟环境配置错误,我刚刚遇到了这个问题。
如果已安装的应用程序在您 运行 celery 所在的虚拟环境中缺少依赖项,则不会自动发现已安装应用程序的任务。当我从同一台机器上的 运行 我的网络服务器和芹菜转移到分布式解决方案时,这让我很震惊。错误的构建导致不同节点上的不同环境文件。
我添加了缺少的依赖项,然后重新启动了 celery 服务。
我的问题是 celery 命令中 celery.py
的路径错误。
命令应该是这样的:
celery worker -A <project_name.celery_app_module> -l info
其中芹菜celery_app_module
是这样的:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# Set default Django settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<project_name>.settings')
app = Celery('<project_name>', include=['<app_name>.tasks'])
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))