如何配置Celery使用pickle序列化器解决反序列化拒绝错误
问题根因
Celery 4.0及以上版本为了规避pickle反序列化的安全漏洞,默认将pickle标记为不安全的序列化类型,即使代码中配置了各类序列化参数,worker启动时默认也会拦截pickle类型的内容反序列化。
正确配置方案
以下两种方式任选其一即可,也可以同时配置双重保证:
方式1:仅修改tasks.py配置代码
在现有配置基础上补充2行配置即可,完整配置如下:
app = Celery( main='tasks', backend='rpc://', broker='pyamqp://USERNAME:PASSWORD@localhost', ) app.conf.task_serializer = 'pickle' app.conf.result_serializer = 'pickle' app.conf.event_serializer = 'pickle' app.conf.accept_content = ['pickle'] app.conf.task_accept_content = ['pickle'] app.conf.result_accept_content = ['pickle'] app.conf.event_accept_content = ['pickle'] # 新增以下2行配置 app.conf.worker_accept_content = ['pickle'] app.conf.allow_unsafe_serializers = True
方式2:启动worker时添加运行参数
不需要修改现有配置代码,直接在启动命令中添加允许pickle序列化的参数即可,修改后的启动命令如下:
celery --app tasks worker --concurrency=1 -n by_hand_1 --serializer=pickle --accept-content=pickle & sleep 5 celery --app tasks worker --concurrency=1 -n by_hand_2 --serializer=pickle --accept-content=pickle
注意:pickle序列化存在反序列化远程代码执行的安全风险,仅在你完全信任所有任务提交方的环境中使用,对外公开服务不建议开启该配置。
内容的提问来源于stack exchange,提问作者Trevor Boyd Smith
相关产品推荐
相关产品推荐

