这是一个古老的 bug,在网上已经有很多解决方法
Celery Repo 负责修复这个 bug 的 PR 因为提交 PR 的人没有写 Unit Test,所以就没有 merge。
本文讲述的是 MongoBackend
重写,使用 MongoDB
的朋友可以参考。其他 custom backend 也可以参考。
问题重现
配置好了 Celery 后,设置了 timezone
enable_utc = True
,timezone = "Asia/Shanghai"
,
启动 Celery
,并尝试触发 Task
,然后查看数据库
上面是修改后的国内时间,下面是没有修改的
发现没有做任何修改的时候,我们在 backend database 存result
的date_done
的时区是默认的 utc
celery/backends/base.py
1 | def _get_result_meta(self, result, |
把 date_done = datetime.utcnow()
改成 date_done = datetime.now()
就可以了,但是要在 python package 的目录下修改。
解决办法
在一个与别人合作的项目里,如果告诉别人去自己 python package 的安装目录下修改代码,那必然是不优雅的
因此,想要使用 MongoDB 存储 Celery Task 的results
,那就额外加一个 python 文件,例如:patch.py
1 | from celery.backends.mongodb import MongoBackend |
然后在需要使用 Celery 的地方修改result_backend
,其中patch
就是 module
名字
1 | from extensions import MongoBackend |
运行以后,timezone
就是正确的了。