Open edX Koa-1.0发送批量课程邮件时Celery报无Router属性的AttributeError
问题根因
该报错是Celery版本与Open edX Koa-1.0不兼容导致的:
- Open edX Koa-1.0 官方适配Celery 4.x系列,在Celery 5.0及以上版本中,原先挂载在
celery根模块下的Router类被迁移到celery.app.routes模块内,不再对外暴露根级导入路径 - 你之前执行pip重装Celery时,默认拉取了最新的高版本Celery,edx-platform内置的任务路由配置中通过字符串形式引用了
celery.Router,高版本下无法找到该属性就会抛出对应错误。
无需调整
celery/app/routes.py的存放位置:报错日志中涉及的文件路径完全正确,问题根源是模块导出属性变更,和文件存储路径无关。
推荐修复方案(版本对齐)
- 卸载当前虚拟环境中安装的高版本Celery
执行命令:/opt/bitnami/apps/edx/venvs/edxapp/bin/pip uninstall celery -y - 安装Koa版本官方兼容的Celery指定版本
celery==4.4.7
执行命令:/opt/bitnami/apps/edx/venvs/edxapp/bin/pip install celery==4.4.7 - 同步安装适配的kombu版本
kombu==4.6.11,避免组件联动不兼容
执行命令:/opt/bitnami/apps/edx/venvs/edxapp/bin/pip install kombu==4.6.11 - 重启所有Celery worker、LMS、CMS服务使依赖变更生效,再重新触发批量课程邮件任务验证。
临时兜底方案(不推荐长期使用)
如果受环境约束无法安装指定旧版Celery,可以通过修改模块导出的方式临时补全缺失的Router属性,无需改动业务路由配置:
找到edxapp虚拟环境下的celery/local.py文件,在文件末尾添加以下代码,将指定路径的Router类重新挂载到celery根模块:
from celery.app.routes import Router original_getattr = ModuleType.__getattribute__ def patched_getattr(self, name): if name == "Router": return Router return original_getattr(self, name) ModuleType.__getattribute__ = patched_getattr
注意:高版本Celery还存在多处与Koa版本edx-platform不兼容的API变更,该方案仅能绕过当前报错,长期运行会触发其他隐式异常,优先使用版本对齐的修复方案。
内容的提问来源于stack exchange,提问作者Gen Evil
相关产品推荐
相关产品推荐

