2014-02-17 79 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