【问题标题】:Django Celery Directory Structure and LayoutDjango Celery 目录结构和布局
【发布时间】:2023-03-23 17:47:01
【问题描述】:

我有一个使用以下目录结构的 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 教程 (http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html) 的 celery.py 的内容。

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 文件 用“帐户”替换“报告”。我不应该有一个位于同一级别的芹菜文件吗 作为manage.py?任何帮助或建议将不胜感激。

【问题讨论】:

  • 接受了@qwattash 的回答,因为它让我到达了我要去的地方。但这真的是标准吗?我有每个项目的系统和设置“应用程序”,celery.py 是否属于其中之一?似乎这只是一个偏好问题,但如果有一个明确的标准,我想遵循它。

标签: python django rabbitmq celery django-celery


【解决方案1】:

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

希望这会有所帮助。

【讨论】:

  • 另请注意,您将 celery.py 放在第二级项目文件夹中,并像这样调用它“celery -A project worker -l info”,其中项目指的是该第二级文件夹。
【解决方案2】:

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

【讨论】:

  • 你能扩展一下吗?我尝试将它添加到 /project/__init__.py 但最终出现各种导入错误。芹菜教程说把它放在 /projects/reports/__init__.py (docs.celeryproject.org/en/latest/django/…)
  • 这可能是您的目录结构的问题,因为我在多个应用程序中都以这种方式使用它,我的“核心”应用程序中的 celery.py 也包含我的设置。你的 manage.py/settings 文件在哪里?
  • 更新帖子。我的设置在 /settings/__init__.py
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
相关资源
最近更新 更多