如何在django-celery中配置TASK_SERIALIZER

7 投票
3 回答
9682 浏览
提问于 2025-04-16 21:06

我正在使用django-celery,想把 TASK_SERIALIZER 设置为JSON,而不是默认的pickle。

我可以通过逐个修改我的任务装饰器来实现这一点,从

@task

改成

@task(serializer="json")

但是我想全局设置这个选项。在 settings.py 中设置

TASK_SERIALIZER="json"

并没有效果。尝试运行

import celery
celery.conf.TASK_SERIALIZER="json"

(正如这里所暗示的)结果是

AttributeError: 'module' object has no attribute 'conf'

有没有什么办法可以在通过django运行celery时配置这个设置?

3 个回答

1

来自文档的内容:

对于任务消息,你可以把CELERY_TASK_SERIALIZER设置为“json”或“yaml”,而不是使用pickle。目前对于任务结果没有其他解决方案(不过用JSON写一个自定义的结果后端其实很简单)。

所以设置CELERY_RESULT_SERIALIZER = "json"看起来没什么用。在我的情况下,结果仍然是pickle格式(Celery 3.1.3)。是的,我知道……

6

我发现创建一个celeryconfig文件(就像文档里推荐的那样)能让事情变得更整洁。

celeryconfig.py

# Celery configuration file
BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'amqp://'

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'America/Los_Angeles'
CELERY_ENABLE_UTC = True

你可以用这个命令来设置它(在你调用Celery之后)。

celery.config_from_object('celeryconfig')
24

我搞明白了。

settings.py 文件里,你需要设置

CELERY_TASK_SERIALIZER = "json"

文档有点让人困惑,至少对我来说是这样。

撰写回答