2015-05-07 181 views
2

我有一个django项目使用以下目录结构。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从芹菜教程(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:[email protected]alhost: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生活在同一级 吗?任何帮助或建议将不胜感激。

+0

接受@qwattash回答,因为它让我知道我要去哪里。但这真的是标准吗?我有系统和设置“应用程序”为每个项目,celery.py属于其中之一?看起来这只是一个偏好问题,但如果有一个明确的标准,我想遵循它。 – scoopseven

回答

1

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

要定义便携式任务,将它们放入正在使用它们的应用程序中是有意义的,正如您所指出的那样,在您的情况下为报告应用程序。

这个想法是,你的任务文件是由项目中定义的任何芹菜应用程序注册的,你的django应用程序不需要知道哪个芹菜应用程序正在注册任务。您可以使用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 

希望这有助于。

+1

另外请注意,您将celery.py放在第二级项目文件夹中,并将其称为“celery -A project worker -l info”,其中项目指向第二级文件夹。 – scoopseven

0

您只需要一个芹菜文件。只要__init__文件位于同一文件夹中并且具有所需的呼叫,建议您将其放在主项目目录或设置的位置。

+0

你可以扩展一下吗?我试图将其添加到/project/__init__.py,但最终导致了各种导入错误。芹菜教程说它把它放在/projects/reports/__init__.py(http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html) – scoopseven

+0

这可能是你的问题目录结构,因为我在多个应用程序中使用它,在我的“核心”应用程序中使用celery.py,其中还包含我的设置。你的manage.py/settings文件在哪里? – onyeka

+0

或者只是你的设置文件,我看到你的manage.py,对不起。 – onyeka