【发布时间】:2015-09-20 20:15:00
【问题描述】:
过去一周我一直在尝试学习 Celery,并将其添加到我使用 Django 和 Docker-Compose 的项目中。我很难理解如何让它工作;我的问题是在使用任务时我似乎无法上传到我的数据库来工作。上传功能,insertIntoDatabase,在没有任何涉及 Celery 的情况下工作正常,但现在上传不起作用。事实上,当我尝试上传时,我的网站很快就告诉我上传成功,但实际上没有上传任何内容。
服务器以docker-compose up 启动,它将进行迁移、执行迁移、收集静态文件、更新需求,然后启动服务器。这一切都是使用pavement.py 完成的; Dockerfile 中的命令是CMD paver docker_run。在任何时候都没有明确启动 Celery 工人;我应该这样做吗?如果有,怎么做?
这是我在views.py中调用上传函数的方式:
insertIntoDatabase.delay(datapoints, user, description)
上传函数在一个名为databaseinserter.py 的文件中定义。以下装饰器用于insertIntoDatabase:
@shared_task(bind=True, name="database_insert", base=DBTask)
这里是celery.py中DBTask类的定义:
class DBTask(Task):
abstract = True
def on_failure(self, exc, *args, **kwargs):
raise exc
我不确定要为tasks.py 写什么。在我从他离开的地方继续之前,这是一位前同事留下的:
from celery.decorators import task
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
@task(name="database_insert")
def database_insert(data):
这是我用来配置 Celery 的设置 (settings.py):
BROKER_TRANSPORT = 'redis'
_REDIS_LOCATION = 'redis://{}:{}'.format(os.environ.get("REDIS_PORT_6379_TCP_ADDR"), os.environ.get("REDIS_PORT_6379_TCP_PORT"))
BROKER_URL = _REDIS_LOCATION + '/0'
CELERY_RESULT_BACKEND = _REDIS_LOCATION + '/1'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = True
CELERY_TIMEZONE = "UTC"
现在,我猜tasks.py 中的database_insert 不应该是空的,但是应该去那里呢?此外,tasks.py 中似乎没有发生任何事情——当我添加一些日志语句以查看 tasks.py 是否至少正在运行时,实际上没有任何内容最终被记录,这让我认为 tasks.py 是甚至没有被运行。如何正确地将我的上传功能变成一个任务?
【问题讨论】:
-
传递给 delay() 的数据点和用户参数是什么?
-
datapoints是字典对象的列表,user只是一个字符串。数据点被转换为适合我们models.py的 Django 对象。在 Celery 推出之前,上传一直运行良好。
标签: django celery docker-compose