2015-05-07 179 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