Django Celery 目录结构和布局

Django Celery Directory Structure and Layout

我有一个使用以下目录结构的 django 项目。

project/
  account/
      models.py
      views.py 
  blog/
      models.py
      views.py
  mediakit/
      models.py
      views.py
  reports/
      celery.py <-- new
      models.py
      tasks.py <-- new
      views.py
  settings/
      __init__.py <-- project settings file
  system/
      cron/
      mongodb/
      redis/
  manage.py

这里是celery.py的内容,来源于celery教程(http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html)。

from __future__ import absolute_import

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')

from django.conf import settings

# app = Celery('reports')
app = Celery('reports',
             backend='djcelery.backends.database:DatabaseBackend',
             broker='amqp://guest:guest@localhost:5672//')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


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

我的一些应用程序是跨项目共享的。报告,例如可能用于 4 个不同的项目,所以 我可以看到 tasks.py 应该如何存在于报告应用程序中,所以当它被添加到一个新项目时 任务随之而来。我不太明白的是为什么 celery.py 需要存在于报告应用程序中 也。当我向帐户应用程序添加一些任务时,我基本上是在构建相同的 celery.py 文件 将 'reports' 替换为 'account'。我不应该有一个生活在同一水平的芹菜文件吗? 作为 manage.py?任何帮助或建议将不胜感激。

你只需要一个芹菜文件。建议您将它放在主项目目录中,或者您的设置所在的位置,只要 __init__ 文件在同一文件夹中并且具有所需的调用即可。

celery 应用程序文件应该位于项目的核心目录中,以及您发布的文档中显示的设置和所有其他内容。

要定义可移植任务,将它们放在使用它们的应用程序中是有意义的,正如您所指出的,在您的情况下是报告应用程序。

这个想法是你的任务文件是由项目中定义的任何 celery 应用程序注册的,你的 django 应用程序不需要知道哪个 celery 应用程序正在注册任务。您可以使用 shared_task 装饰器代替 app.task.

总结:

project/
  project/
      settings.py
      celery.py <- new, shown in the docs, also add __init__.py
      urls.py
  account/
      models.py
      views.py 
  blog/
      models.py
      views.py
  mediakit/
      models.py
      tasks.py <-- tasks for the me
      views.py
  reports/
      models.py
      tasks.py <-- tasks for the reports app
      views.py
  manage.py

在 tasks.py 你有这样的东西:

from celery import shared_task

@shared_task
def my_add_task(a, b):
    return a + b

希望这对您有所帮助。