2014-02-17 127 views
1

我指的是Django Celery文件。在DB-Django中保存芹菜任務

我在我的proj/proj中創建了celery.py,正如文檔所述。然後包括__init__.py

celery.py

from __future__ import absolute_import 
import os 
from celery import Celery 
from django.conf import settings 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings') 
app = Celery('proj') 
app.conf.update(
    CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend', 
) 
app.config_from_object('django.conf:settings') 
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 

__init__.py

from __future__ import absolute_import 
from .celery import app as celery_app 

我安裝pip install django-celery,然後遷移python manage.py migrate djcelery 它在我的數據庫做一些表。

tasks.py

from __future__ import absolute_import 
from celery import shared_task 
import requests 
import json 

@shared_task 
def post_notification(data,url): 
    headers = {'content-type': 'application/json'} 
    requests.post(url, data=json.dumps(data), headers=headers) 

之後,我打電話給我的任務,我的意見,

task = post_notification.delay(data,url) 
print task.id #it prints an id 
print task.status # prints PENDING 

但沒有被登錄到我的任何表。

我讀過我的線索上,Thread1,Thread2和更多的這些線程上給出,但沒有任何反應。

它提供了我的ID &狀態的任務,但如何將任務保存在數據庫中?通常它應該登錄到celery_taskmeta,但那裏沒有東西。

雖然任務得到執行,但我想將任務保存在數據庫中。我該怎麼做?有什麼我失蹤?

+0

你不應該這樣評估'app.conf'('app.conf.update'),因爲它會提前加載django設置模塊。您應該在settings.py中設置'CELERY_RESULT_BACKEND'設置。你還記得添加'djcelery'到INSTALLED_APPS嗎?如果你想設置後端作爲默認設置,那麼你可以使用'app = Celery(...,backend ='djcelery.backends.database:DatabaseBackend')。請注意,只有當工作人員寫入重試/失敗/成功狀態時,結果纔會更新,並且PENDING狀態不會保存到數據庫中,而是所有未知ID都將處於PENDING狀態。 – asksol

回答

0

加入settings.py文件

BROKER_URL = 'amqp://guest:[email protected]//' 
CELERY_ACCEPT_CONTENT = ['json'] 
CELERY_TASK_SERIALIZER = 'json' 
CELERY_RESULT_SERIALIZER = 'json' 

跟隨和啓動工作。

0

嘗試這種在celery.py

from __future__ import absolute_import 
import os 
from celery import Celery 
from django.conf import settings 
from celery.schedules import crontab 

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

app = Celery('app_name') 

# 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.conf.CELERY_TIMEZONE = 'UTC' 
app.conf.update(
    CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend', 
) 
+0

@ user1162512希望它能解決您的問題 –

+0

號仍然沒有效果。順便提一下,它是'app_name.dev_settings'還是隻有'app_name.settings'沒有'dev'? – PythonEnthusiast

+0

試了兩個。沒有效果。 – PythonEnthusiast